社区
Oracle
帖子详情
pro*C中的VARCHAR 类型变量问题!
tyqiu
2003-09-11 11:09:59
将一表里为varchar类型的数据批量into到一VARCHAR name【100】【20】的变量里,出现coredump,改为char name【100】【20】的话出来的值宽度都为20,我要实现into出来后自动与数据库表里的实际值等宽,怎么办?VARCHAR 类型不支持数组吗?
...全文
66
1
打赏
收藏
pro*C中的VARCHAR 类型变量问题!
将一表里为varchar类型的数据批量into到一VARCHAR name【100】【20】的变量里,出现coredump,改为char name【100】【20】的话出来的值宽度都为20,我要实现into出来后自动与数据库表里的实际值等宽,怎么办?VARCHAR 类型不支持数组吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tyqiu
2003-09-11
打赏
举报
回复
谁能帮我?
PL/SQL 基础.doc
PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1)
Pro
*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和数据库打交道的方法,和
Pro
*C很相似,更底层,很少用 只适合ORACLE; 4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(
Pro
cedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle服务器的操作语言; 3) Oracle对SQL的扩充; 4. PL/SQL的优缺点 优点:1) 结构化模块化编程,不是面向对象; 2) 良好的可移植性(不管Oracle运行在何种操作系统); 3) 良好的可维护性(编译通过后存储在数据库里); 4) 提升系统性能; 缺点 1) 不便于向异构数据库移植应用程序(只能用于Oracle); 5. SQL与PL/SQL的区别 SQL:1) 第四代语言(智能语言); 2) 做什么,不管怎么做; 3) 缺少过程与控制语句; 4) 无算法 PL/SQL: (相对SQL扩展部分) 1) 扩展
变量
和
类型
; 2) 扩展控制结构; 3) 扩展过程与函数; 4) 扩展对象
类型
与方法 ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何
变量
,可以不写); 2) 执行部分, BEGIN <---------> END; 3) 异常处理,EXCEPTION(可以没有); 2. PL/SQL开发环境 可以运用任何纯文本的编辑器编辑,例如:VI 3. PL/SQL字符集 字母: A-Z, a-z; 数字: 0-9; 空白: TAB , SPACE , 回车; 符号: +_)(*&^%$#@!~ ; PL/SQL对大小写不敏感(注意) 4. 标识符命名规则答: 1) 字母开头; 2) 后跟任意的 非空格字符 数字 货币符号( $ ) 下划线( _ ) 或 # ; 3) 最大长度为30个字符(八个字符左右最合适); 用来给对象命名(潜规则):
变量
: 以v_开头 游标: 以c_开头
类型
: 子程序: 5. 分界符 1) 运算符 + - * / **(指数操作符) 2) 关系 =(相当于JAVA
中
的==) > < <> != ~= ^= <= >= 3) 赋值 := 例子a:=2 4) 连接 || 例: 'abc' || 123 5) 标号 << 需要的标记 >> 6) 注释 --(单行) /* */(段落) 7) 替代
6. 文字 1)字符型文字(字符串) 'tom' (单引号) 'tom''s pen' ''为2个单引号(标识转义) 为tom's pen 2)数字型 123 -4 +56 0 9.0 1.23E5 9.8e-3 3)布尔型 TRUE FALSE NULL 7.
变量
声明 语法 Var_name [CONSTANT](标识常量,可选) type [NOT NULL](标识为not-null后必须在后面初始化) [:=value](赋值,初始化); Var_name [CONSTANT](标识常量,可选) type [NOT NULL] [ default value](赋值,初始化)等同于上面的语句; 注:1) 申明时可以有默认值也可以没有; 2) 如有[CONSTANT][NOT NULL],
变量
一定要有一个初始值; 3) 赋值语句为“:=”; 4)
变量
可以认为是数据库里一个字段; 5) 规定没有初始化的
变量
为NULL; ---- 第三章
变量
与数据
类型
---- 1. 数据
类型
1) 标量型:数字型(BINARY_INTEGER,NUMBER)(DEC,FLOAT,REAL... NUMBER的子
类型
)、 NUMBER(P,S) P:精度:整个的有效数位(从左边开始第一个不为0的数字起) S:刻度,可选(小数点后面的保留位数) BINARY_INTEGER:保存整数. 和NUMBER的底层的保存方式不同, BINARY_INTEGER为2进制保存,NUMBER 需要考虑其他东西不是2进制方式 BINARY_INTEGER之间做加法效率快而NUMBER要先转换2进制再计算 单纯的计算---->BINARY_INTEGER 考虑和表
中
其他数据的交互的话一般------->NUMBER 字符型、CHAR
VARCHAR
VARCHAR
2 STRING LONG 一般CHAR
VARCHAR
2就够了 CHAR 定长(例子:CHAR(5) 如果不够5个字符的话就会用空白填充 ) ,可以不带长度规定(默认为1)
VARCHAR
2 变长((
VARCHAR
2(5)标识最长可以保存5个字符) 后面的长度规定必须要有 布尔型、BOOLEAN 日期型; DATE(后增加 TIMESTAMP(比DATE更精细点(精确到秒) INTERVAL) 一般用DATE 2) 组合型:RECORD(常用)、TABLE(常用)、VARRAY(较少用) 3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [
变量
名] [表名.字段名] [%TYPE] 表示
变量
具有与数据库的表
中
某一字段相同的
类型
例:v_FirstName s_emp.first_name%TYPE; 3. RECORD
类型
TYPE t_emp IS RECORD( /*其
中
TYPE,IS,RECORD为关键字,record_name为
变量
名称*/ field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/ field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/ ... /*所有没有初始化的字段都会初始为NULL*/ fieldn type [NOT NULL][:=exprn] ); 4. %ROWTYPE 返回一个基于数据库定义的
类型
DECLARE v_emp s_emp%ROWTYPE; /*s_emp为表的名字*/ 注:与RECORD
类型
中
定一个record相比,一步就完成, 而RECORD
类型
中
定义分二步:a. 所有的成员
变量
都要申明; b. 实例化
变量
; 可以代替RECORD
类型
. 5. TABLE
类型
TYPE tabletype IS TABLE OF type(
类型
名,要保存成的数据
类型
) INDEX BY BINARY_INTEGER; 例:DECLARE TYPE t_emp IS TABLE OF s_emp%ROWTYPE INDEX BY BINARY_INTERGER; v_emp t_emp; BEGIN SELECT * INTO v_emp(100) FROM s_emp WHERE id = 1; SELECT * INTO v_emp(200) FROM s_emp WHERE id = 2; DBMS_OUTPUT.PUT_LINE(v_emp(200).id||' '||v_emp(200).lastname||' '||v_emp(200).salary); END; 注:1) id(索引) 的数目的限制由BINARY_INTEGER的范围决定(-2147483647<----->2147483647); 2) TABLE
类型
与map
类似; 3) 表
中
的元素可以是复合
类型
; 4) KEY 没有必要是顺序的; 5) 当数据被插入表
中
的时候,表所需的空间就被分配了; 6.
变量
的作用域和可见性 <
> 1) 执行块里可以嵌入执行块; 2) 里层执行块的
变量
对外层不可见; 3) 里层执行块对外层执行块
变量
的修改会影响外层块
变量
的值 (在此里层,对其他里层则不影响,想要不影响此里层的话可以使用标号标注外层); ---- 第四章 PL/SQL控制语句 ---- 1. 条件语句 IF boolean_expression1(条件1) THEN ... ELSIF boolean_expression2(条件2) THEN /*注意是ELSIF,而不是ELSEIF*/ ... /*ELSE语句(ELSIF)不是必须的,但END IF;是必须的*/ ELSE ... END IF; 注意:1)有多个BOOLEAN表达式时候 AND(与),OR(或),NOT(非) 2)条件为FALSE与TRUE 相同; 2. 循环语句 1) Loop 循环 Loop ... (循环体) IF boolean_expr(条件) THEN /* 加条件语句,当满足条件时候退出循环*/ EXIT; /* EXIT WHEN boolean_expr */ END IF; END LOOP; 2) WHILE 循环 WHILE boolean_expr(条件) LOOP /* boolean_expr 循环条件*/ ... (循环体) END LOOP; 3) FOR循环 FOR loop_counter IN [REVERSE] low_bound..high_bound LOOP /* 范围
中
间用2个点表示 从 low_blound 到 high_bound */ ... (循环体) END LOOP; 例: FOR v_cnt IN 1..5 LOOP SELECT * INTO v_emp FROM s_emp WHERE id = v_cnt; 注:a. 加上REVERSE关键字 表示递减,从结束边界到起始边界,递减步长为一; 不加为递增,从起始边界到结束边界,递减步长为一; b. low_blound 起始边界; high_bound 结束边界; 3. GOTO语句 GOTO label_name; 1) 只能由内部块跳往外部块; 2) 设置标签:<< >> 3) 示例: LOOP ... IF D%ROWCOUNT = 50 THEN GOTO l_close; END IF; ... END LOOP; <
>: ... 4. NULL语句 在语句块
中
加空语句,用于补充语句的完整性。 例:IF boolean_expr THEN ... ELSE NULL; END IF; 5. SQL in PL/SQL 1) 只有DML SQL和transaction Control SQL可以直接在PL/SQL
中
使用; 2) PL/SQL
中
的动态SQL可以使用所有有效的SQL语句,包括DDL; 3) 动态SQL在运行时动态生成SQL语句,然后分析语句并执行; 4) PL/SQL
中
的动态SQL有两种:本地动态SQL和DBMS_SQL包; ---- 第五章 PL/SQL游标 ---- 1. 游标(CURSOR) 游标是从数据表
中
提取出来的数据,以临时表的形式存放在内存
中
,在游标
中
有一个数 据指针,在初始状态下指向的是首记录,利用 fetch 语句可以移动该指针,从而对游标
中
的数 据进行各种操作,然后将操作结果写回数据表
中
。 1)分类: a)显式游标:程序员可以操作控制,是针对select 语句的,指向select 语句的结束集 b)隐式游标:程序员不可控制,但可以有限制的应用 2)作用:用于处理查询语句的结果,提取多行数据集; 3)使用步骤: a) 声明游标: a. 普通声明: DELCARE v_emp s_emp%ROWTYPE; v_did s_dept.id%TYPE; CURSOR cur_emp IS select * FROM s_emp WHERE dept_id =v_did; /* CURSOR的内容必须是一条查询语句 */ b. 带参数声明明:DELCARE CURSOR c_emp(v_did s_emp.ID%TYPE) SELECT * FROM s_emp WHERE dept_id = v_did; b) 为查询打开游标: OPEN cur_emp; /* 相当于执行select语句,且把执行结果存入CURSOR; c) 从游标
中
取结果,存入PL/SQL
变量
中
: a. FETCH cur_emp INTO var1, var2, ...(
变量
名 1,
变量
名 2,.......); /*
变量
的数量、
类型
、顺序要和Table
中
字段一致; */ b. FETCH cur_emp INTO record_var(记录型
变量
名); 注:将值从CURSOR取出放入
变量
中
,每FETCH一次取一条记录; d) 关闭游标: CLOSE cur_emp; 注:a. 游标使用后应该关闭; b. 关闭后的游标不能FETCH和再次CLOSE; c. 关闭游标相当于将内存
中
CURSOR的内容清空; 2. 游标的属性 游标名%属性名 1) %FOUND: 是否有值; 有则返回TRUE,否则返回FALSE; 2) %NOTFOUND: 是否没有值; 如果没有值则返回TRUE,否则返回FALSE; 3) %ISOPEN: 是否是处于打开状态; 处于打开状态就返回TRUE,否则返回FALSE; 4) %ROWCOUNT: CURSOR当前的记录号(当前游标的指针位移量,表示在此之前,游标所处理的数据量(多少条记录)); 3. 游标的FETCH循环 1) LOOP FETCH 游标名 INTO 定义的
变量
EXIT WHEN 游标名%NOTFOUND; /* 当游标没取道记录后退出 要及时的做出判断 */ END LOOP; 2) WHILE 游标名%FOUND LOOP FETCH 游标名 INTO 定义的
变量
; END LOOP; 3) FOR 保存数据的
变量
(不用事先定义,是根据游标声明的时候SELECT 的
类型
来确定) IN 游标名 LOOP (FETCH 游标名 INTO ...) (可以不用FETCH 语句) END LOOP; 4.带参数的游标CURSOR DECLARE v_emp s_emp%ROWTYPE CURSOR cur_emp(p_did s_emp.dept_id%TYPE) IS /* 定义参数p_did的
类型
*/ SELECT * FROM s_emp WHERE dept_id= p_did FOR UPDATE OF salary; /*FOR UPDATE OF salary; 加行级锁,在我修改这些数据的时候, *其他人无法修改数据,直到游标被CLOSE后 */ BEGIN OPEN cur_emp(31); /*带的参数值 31 就是赋给参数p_did 的 */ LOOP FETCH cur_emp INTO v_emp; EXIT WHEN cur_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name); END LOOP; CLOSE cur_emp; END 5.显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下; 而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。 对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。 用户只能通过隐式游标的相关属性,来完成相应的操作。 在隐式游标的工作区
中
,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。 格式调用为: SQL% 注:INSERT, UPDATE, DELETE, SELECT 语句
中
不必明确定义游标。 隐式游标属性 SQL%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为true; SQL%NOTFOUND 布尔型属性,与%found相反; SQL %ROWCOUNT 数字型属性, 返回已从游标
中
读取得记录数; SQL %ISOPEN 布尔型属性, 取值总是FALSE。SQL命令执行完毕立即关闭隐式游标。
OraclePLSQL编程经典例子
PL/SQL编程 pl/sql(
pro
cedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义
变量
和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表
中
添加数据。 1. create table mytest (name
varchar
2(30),passwd
varchar
2(30)); 2. create or replace
pro
cedure xxc_
pro
1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_
pro
1; 或者是 ② call xxc_
pro
1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(
变量
)的命名规范: ① 当定义
变量
时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,
变量
,游标,例外,复杂数据
类型
*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sql块 SQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其
中
之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename
varchar
2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入
变量
,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename
varchar
2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename
varchar
2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程
中
使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql
中
可以使用create
pro
cedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace
pro
cedure xxc_
pro
3(newname in
varchar
2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;
Pro
*C入门手册+语法详解
Pro
*C语法详解 概述 嵌入式 SQL 是一种结合 C/C++ 等高级语言的计算能力和 SQL 的数据库操作能力的方法。它允许您从应用程序执行任何 SQL 语句。Oracle 的嵌入式 SQL 环境称为
Pro
C。
Pro
C 程序分两步编译。首先,
Pro
*C预编译器 识别程序
中
嵌入的 SQL 语句,并将它们替换为对 SQL 运行时库
中
函数的适当调用。输出是纯 C/C++ 代码,所有纯 C/C++ 部分都完好无损。然后,使用常规 C/C++ 编译器编译代码并生成可执行文件。有关详细信息,请参阅演示程序部分。
pro
*c的使用
利用在语言内嵌入sql语言或者调用oracle库函数来访问数据库,例如
Pro
*c
宿主
变量
Pro
*C
1.宿主
变量
是一种
Pro
*C语言
变量
,用于在应用程序
中
和oracle数据库之间传递数据,
Pro
*C程序
中
, 既可在SQL语句
中
引用,也可在C语句
中
引用的
变量
称为SQL
变量
. 2.宿主
变量
一般定义在语句EXEC SQL BEGIN DECLARE SECTION和EXEC SQL END DECLARE SECTION之间. 3.宿主
变量
的数据
类型
数据
类型
描述 ch...
Oracle
17,082
社区成员
55,236
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章