PLSQL表变量类型
TYPE typ_id_record is RECORD(
gid NUMBER(10);
gno NUMBER(5);
co NUMBER(5));
TYPE typ_record_table is table of typ_id_record;
注意:PLSQL表变量类型必须在包头定义,否则会提示:Error:PLS-00642:不允许使用本地收集类型
集合在使用前需清空,typ_record_table.delete
对象表变量类型
CREATE OR REPLACE TYPE typ_id_object as OBJECT(
gid NUMBER(10);
gno NUMBER(5);
co NUMBER(5));
CREATE OR REPLACE TYPE typ_table_object as table of typ_id_object;
使用bulk collect批量获取查询结果集
bulk collect的使用区别
PLSQL表变量typ_record_table可以直接接受bulk collect,但对象表变量typ_object_table必须先进行转换
如下所示:
PLSQL表变量typ_record_table
CREATE OR REPLACE PROCEDURE p_f4 IS
tab_ids type_record_table;
BEGIN
SELECT gp.gid, gp.gno, gp.co BULK COLLECT
INTO tab_ids
FROM p_table_test gp;
END p_f4;
对象表变量typ_table_object不能直接接受bulk collect,必须进行转换
如下所示:
报错:没有足够的值
CREATE OR REPLACE PROCEDURE p_f4 is
tab_ids type_table_object;
begin
select gp.gid,gp.gno,gp.co bulk collect
into tab_ids
from p_table_test gp;
end;
解决办法: 将object变量进行转换,如下所示:
CREATE OR REPLACE PROCEDURE p_f4 is
tab_ids type_table_object;
begin
select type_table_object(gp.gid,gp.gno,gp.co) bulk collect
into tab_ids
from p_table_test gp;
end;
在此,要感谢itpub的windtalker_cs,是他的回答让我明白了一直困扰我的一个问题,之前以为如果采用object对象表,就无法使用bulk collect批量获取结果集。
利用table()函数,我们可以将PL/SQL返回的结果集代替table
是否可以使用table函数
函数返回若是PLSQL类型变量则无法使用table函数,而object类型变量可以使用table()函数直接返回结果集