当前位置:文档之家› 玩转oracle-plsql定义并使用变量

玩转oracle-plsql定义并使用变量

I 、介绍:在编写pl/sql 程序时候,可以定义变量和常量,在pl/sql 中包括有: 标量类型( scalar ) 复合类型( composite ) 参照类型( reference ) lob ( large object );在编写 pl/sql 的时候,如果要使用变量,需要在定义部分定义变量;pl/sql 中定义变量和常量的语法如下:identifier [constant] datatype [ not null ]identifier : 名称;constant : 指定常量,需要指定他的初始值,而且他的值是不能够改变的;datatype :数据类型;not null ;指定变量不能为 null ;:= 给变量或是常量指定初始值;default :用于指定初始值;expr :指定初始值的 pl/sql 表达式,可以是文本、其他变量、函数等; ① 定义一个变长字符串: v_ename varchar2 ( 20);② 定义一个数: v_sal number (6,3 );③ 定义一个数并给定初始值: v _sal number (5,3 ):=5.4④ 定义一个日期类型的数据: v _hitedate date ;⑤ 定义一个 bool 变量,不能为 null ,初始值为 false ;v_valid boolean not null default false ; ㈡、标量:使用标量 在定义好变量后就可以使用这些边玲了,这里需要说明的是 pl/sql 块为变量赋 值不同于其他编程语言,需要使用 := 符号;SQL> -- 下面以输入员工号,显示员工姓名等信息;SQL> declare2 c_tax_rate number(3,2):=0.03;3 -- 用户名;4 v_name varchar2(5);5v_sal number(6,2); 6v_tax_sal number(6,2); 7begin 8-- 执行 910select ename ,sal into v_name , v_sal from emp where empno=&no; 11 -- 计算所得税‘标量: scalar )常用的类型:[:=|default expt]12v_tax_sal:=v_sal*c_tax_rate;13-- 输出;14dbms_output.put_line('Name is : ' || v_name|| ' sal is '||v_sal||' tax is '||v_tax_sal);15end;16/Enter value for no: 7788old 10: select ename,sal into v_name, v_sal from empwhere empno=&no;new 10: select ename,sal into v_name, v_sal from empwhere empno=7788; Name is : SCOTT sal is 3000 tax is 90PL/SQL procedure successfully completed.㈢、标量:使用%type类型;对于上面的pl/sql 块有一个问题:如果员工的姓名操过了 5 个字符的话救护出错,为了降低pl/sql 程序的维护工作量,可以使用%type属性定义变量,这样他会按照数据库列来确定你定义的变量类型和长度;标识符名称表明•列名%type;SQL> -- 下面以输入员工号,显示员工姓名等信息;SQL> declare2c_tax_rate number(3,2):=0.03;3-- 用户名;4v_name emp.ename%type;5v_sal emp.sal%type;6v_tax_sal number(6,2);7begin8-- 执行910select ename ,sal into v_name , v_sal from emp where empno=&no;11-- 计算所得税‘12v_tax_sal:=v_sal*c_tax_rate;13-- 输出;14dbms_output.put_line('Name is : ' || v_name|| ' sal is '||v_sal||'tax is '||v_tax_sal);15end;16/Enter value for no: 7788old 10: select ename,sal into v_name, v_sal from empwhere empno=&no; new 10: select ename,sal into v_name, v_sal from empwhere empno=7788; Name is : SCOTTsal is 3000 tax is 90PL/SQL procedure successfully completed.SQL>U、复合变量(composite);㈠、介绍:用于存放多个值的变量。

主要包括下面几种:①pl/sql 记录;②pl/sql 表;③嵌套表;④varray ;㈡、pl/sql 记录:类似于高级语言中的结构体,需要注意的是,当引用pl/sql 记录成员时候,必须加记录变量作为前缀(记录变量. 记录成员)如下;SQL> --pl/sql 记录实例;SQL> declare2-- 定义复合( pl/sql 记录)类型;emp_record_type3type emp_record_type is record(4name emp.ename%type,5salary emp.sal%type,6tittle emp.job%type);7-- 复合类型定义结束;88-- 定义一个复合类型的变量sp_record ,其类型是emp_record_type ;9sp_record emp_record_type;1110begin11select ename,sal,job into sp_record from emp where empno=7788;12dbms_output.put_line('Name : '||sp_);13end;14/Name : SCOTTPL/SQL procedure successfully completed.㈢、pl/sql 表:相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下表不能为负数,而pl/sql 是可以为负数的,并且表元素的下标没有限制,实例如下:SQL> --pl/sql 表实例;SQL>SQL> declare2-- 定义了一个pl/sql 表类型:sp_table_type ,3--该类型是用于存放emp.ename%type类型的数组;4--index by binary_integer :代表下标是按照整数来排序的;5type sp_table_type is table of emp.ename%type index by binary_integer;66-- 定义了一个sp_table_type 类型的变量:sp_table ;7sp_table sp_table_type;98begin9select ename into sp_table(0) from emp where empno=7788;10dbms_output.put_line('Name : '||sp_table(0));11end;12/ Name : SCOTTPL/SQL procedure successfully completed.说明:sp_table_type :pl/sql 表类型;emp.e name%type指定了表的元素类型和长度;sp_table :为pl/sql 表变量;注意:如果上面的块将where 子句去掉,会怎么样呢?这样就会出错,这是就应该使用参照变量;当然,复合变量还有很多,比如①复合变量:嵌套表(nested table );②复合变量:变长数组(varray );川、参照变量:㈠介绍:参照变量是指用于存放数值指针的变量,通过使用参照变量,我们可以使得应用程序共享相同的对象,从而降低占用的空间,在编写pl/sql 程序的时候,可以使用游标变量( ref cursor )和对象类型变量( ref obj_type) 两种参照变量;㈡参照变量:ref cursor 游标变量;使用游标时候,当定义游标时候,不需要指定相应的select 语句,但是当使用游标(open)的时候就需要指定select语句,这样,一个游标就和一个select 语句结合起来了:实例:①、请用pl/sql编写一个块:可以输入部门号,并显示该部门所有员工姓名和工资;-- 请用pl/sql 编写一个块:可以输入部门号,并显示该部门所有员工姓名和工资;declare-- 定义游标类型:sp_emp_cursor;type sp_emp_cursor is ref cursor;-- 定义一个游标变量;test_cursor sp_emp_cursor;-- 定义变量:v_ename emp.ename%type;v_sal emp.sal%type;begin-- 执行-- 把test_cursor 和一个select 结合;-- 相当于将test_cursor 指向有select 查询返回的结果集;open test_cursor for select ename , sal from emp where deptno=&no;-- 这时候我们可以循环取出结果集中的结果了;-- 开始循环体;loop -- 取值;fetch test_cursor into v_ename ,v_sal;-- 判断是否test_cursor 为空了,如果不判断就会出现死循环的效果;exit when test_cursor%notfound;dbms_output.put_line('Name is '||v_ename ||' Sal is '||v_sal);-- 结束循环体;end loop;end;②、在①的基础上,如果某个员工的工资低于200,就加上100;。

相关主题