将引用游标转换为 pl-sql 中的表类型

Posted

技术标签:

【中文标题】将引用游标转换为 pl-sql 中的表类型【英文标题】:Casting a ref cursor into a table type in pl-sql 【发布时间】:2012-07-11 22:10:01 【问题描述】:

我想将 refcursor 转换为如下所示的表格类型。下面的语法无法编译。目的是将引用的结果放入临时表中,然后在该表上做一些工作。

    create table vtest1 (a number, b number); 
    create table temptable1(a number, b number); 
    declare 
    pOUT SYS_REFCURSOR;
    type vtest1Tab is table of vtest1%rowtype;
    begin
      open pOUT for 'select * from vtest1';
      insert into temptable1(n1,n2)  
      select * from TABLE( cast(pOUT as vtest1Tab));
      close pOUT;
    end;    

谢谢。

【问题讨论】:

您确定需要使用参考光标吗?您确定需要使用临时表吗?当有更简单的选项时,这些都是初学者经常滥用的功能,例如使用普通查询甚至动态查询填充 PL/SQL 集合。 【参考方案1】:

您可以使用bulk collectforall 代替insert into ... select

create table vtest1 (a number, b number);

insert into vtest1 values (1,2);

create table temptable1(a number, b number);

declare 
  pOUT SYS_REFCURSOR;
  type vtest1Tab is table of vtest1%rowtype;
  v_t vtest1Tab;
begin
  open pOUT for 'select * from vtest1';
  fetch pOUT bulk collect into v_t;
  close pOUT;
  forall indx in v_t.first..v_t.last
   insert into temptable1
     values v_t(indx)
    ;
end;
/

【讨论】:

【参考方案2】:

如果您在编译时知道表的名称,我不明白使用 REF 光标的意义吗?为什么不把你的匿名块设置为:

BEGIN
    INSERT INTO temptable1 SELECT * FROM vtest1;
    COMMIT;
END;

如果您真的希望灵活地将源表名称作为字符串传递,那么 GWU 的答案肯定有效。

【讨论】:

以上是关于将引用游标转换为 pl-sql 中的表类型的主要内容,如果未能解决你的问题,请参考以下文章

PL-SQL

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中

将表转换为自定义类型数组

将游标中的数据合并为一个

VBA 中的数据转换类型错误

MySQL 列引用不同的表名