oracle 表类型变量的使用

handle0 2016-02-20

转载于:http://www.itxuexiwang.com/a/shujukujishu/oracle/2016/0216/89.html?1455872314

使用记录类型变量只能保存一行数据,这限制了SELECT语句的返回行数​,如果SELECT语句返回多行就会错。Oracle提供了另外一种自定义类型,也就是表类型,它是对记录类型的扩展,允许处理多行数据,类似于表。

创建表类型的语法如下:

TYPEtable_nameISTABLEOFdata_type[NOTNULL]

INDEXBYBINARY_INTEGER;

语法说明如下:

--table_name创建的表类型名称。

--ISTABLE表示创建的是表类型。

--data_type可以是任何合法的PL/SQL数据类型,例如varchar2。

--INDEXBYBINARY_INTEGER指定系统创建一个主键索引,用于引用表类型变量中的特定行。

使用表类型的例子:

例一:直接对表类型变量赋值

declare

typemy_empistableofscott.emp%rowtype

indexbybinary_integer;

new_empmy_emp;

begin

new_emp(1).empno:=6800;

new_emp(1).ename:='tracy';

new_emp(1).job:='clerk';

new_emp(1).sal:=2500;

new_emp(2).empno:=6900;

new_emp(2).ename:='luck';

new_emp(2).job:='manager';

new_emp(2).sal:=4000;

dbms_output.put_line(new_emp(1).empno||','||new_emp(1).ename||','||new_emp(1).job||

','||new_emp(1).sal);

dbms_output.put_line(new_emp(2).empno||','||new_emp(2).ename||','||new_emp(2).job||

','||new_emp(2).sal);

end;

/

例二:使用表类型变量的方法:变量名.方法名[索引号]

declare

typemy_empistableofscott.emp%rowtype

indexbybinary_integer;

new_empmy_emp;

begin

new_emp(1).empno:=6800;

new_emp(1).ename:='tracy';

new_emp(1).job:='clerk';

new_emp(1).sal:=2500;

new_emp(2).empno:=6900;

new_emp(2).ename:='luck';

new_emp(2).job:='manager';

new_emp(2).sal:=4000;

dbms_output.put_line(new_emp.first||','||new_emp.count||','||new_emp.last);

dbms_output.put_line(new_emp(1).empno||','||new_emp(1).ename||','||new_emp(1).job||

','||new_emp(1).sal);

dbms_output.put_line(new_emp(2).empno||','||new_emp(2).ename||','||new_emp(2).job||

','||new_emp(2).sal);

--new_emp.delete(1);

dbms_output.put_line(new_emp.next(1));

end;

//

例三:与游标结合使用#p#分页标题#e#

declare

typemy_empistableofscott.emp%rowtype

indexbybinary_integer;

new_empmy_emp;

v_numnumber:=0;

cursorcur_empisselectempno,ename,job,salfromscott.emp;

begin

forv_empincur_emploop

v_num:=v_num+1;

select*intonew_emp(v_num)fromscott.emp

whereename=v_emp.ename;

endloop;

foriin1..new_emp.countloop

dbms_output.put_line(new_emp(i).empno||','||new_emp(i).ename||','||new_emp(i).job||

','||new_emp(i).sal);

endloop;

end;

/

注意:不能直接对表变量赋值:select*intonew_empfromscott.empwheredeptno=30;这种赋值方法是错的,赋值需要使用下标,如上面的的例子。

相关推荐