PL/SQL记录(record)主要用于处理单行多列数据。当使用RECORD时,既可以自定义记录的类型和变量,也可以使用%ROWTYPE属性定义记录变量。
TYPE type_name IS RECORD
(
field_declaration,...
);
自定义记录类型,type_name用于指定记录类型的名称,field_declaration用于定义记录成员。
declare
type type_parm is record
(
lst_date com_sys_parm.lst_date%type,
sys_date com_sys_parm.sys_date%type
);
sys_parm type_parm;
begin
select lst_date,sys_date into sys_parm from com_sys_parm;
dbms_output.put_line(sys_parm.lst_date);
dbms_output.put_line(sys_parm.sys_date);
end;
identifier [table_name | view_name]%ROWTYPE;
使用%ROWTYPE属性定义记录变量,identifier用于指定记录变量的名称,table_name用于指定表名,view_name用于指定视图名。
declare
sys_parm com_sys_parm%rowtype;
begin
select * into sys_parm from com_sys_parm;
dbms_output.put_line(sys_parm.lst_date);
dbms_output.put_line(sys_parm.sys_date);
end;
PL/SQL表(table)是Oracle早期版本用于处理PL/SQL集合的数据类型,表的下标可以为负值,并且元素个数无限制,不可以作为表列的数据类型使用。
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;
type_name用于指定表类型的名称,element_type用于指定表的数据类型,NOT NULL表示不允许引用NULL元素,key_type用于指定表下标的数据类型(BINARY_INTEGER、PLS_INTEGER或VARCHAR2)。
declare
type type_item is table of com_item%rowtype index by binary_integer;
it type_item;
begin
select * bulk collect into it from com_item;
dbms_output.put_line(it(1).acc_no||','||it(1).acc_name);
end; 从Oracle DataBase 9i开始,允许使用varchar2定义表的下标。当使用varchar2定义下标时,会按照下标值的升序方式确定元素顺序。
declare
type tbl_type is table of nvarchar2(30) index by varchar2(20);
tbl tbl_type;
begin
tbl('cat'):=1;
tbl('dog'):=2;
tbl('man'):=3;
tbl('pig'):=4;
dbms_output.put_line('第一个元素:'||tbl(tbl.first));
dbms_output.put_line('最后一个元素:'||tbl(tbl.last));
dbms_output.put_line('dog对应的元素:'||tbl('dog'));
dbms_output.put_line('man对应的元素:'||tbl('man'));
end;
PL/SQL 嵌套表(table)用于处理PL/SQL集合的数据类型,表的下标以1开始,并且元素个数无限制,可以作为表列的数据类型使用。
TYPE type_name IS TABLE OF element_type; type_name用于指定嵌套表类型的名称,element_type用于指定嵌套表的数据类型。使用嵌套表时,需要使用其构造方法初始化嵌套表变量。
declare
type type_item is table of com_item%rowtype;
item_table type_item;
v_count integer;
i integer;
begin
select count(*) into v_count from com_item;
select * bulk collect into item_table from com_item;
i:=1;
loop
insert into com_item_bk(acc_no,acc_name) values(item_table(i).acc_no,item_table(i).acc_name);
i:=i+1;
exit when i>v_count;
end loop;
end;
PL/SQL 数组(VARRAY)用于处理PL/SQL集合的数据类型,表的下标以1开始,并且元素个数有限制,可以作为表列的数据类型使用。
TYPE type_name IS VARRAR(size_limit) OF element_type [NOT NULL];
type_name用于指定VARRAY类型的名称,size_limit用于指定VARRAY 元素的最大个数,element_type用于指定元素的数据类型。使用VARRAY时,需要使用其构造方法初始化VARRAY元素。
declare
type acc_varr_type is varray(20) of com_item.acc_no%type;
acc_varr acc_varr_type;
begin
select acc_no bulk collect into acc_varr from com_item where rownum<=20;
dbms_output.put_line('科目号:'||acc_varr(1));
dbms_output.put_line('科目号:'||acc_varr(2));
end;