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()函数直接返回结果集