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

时间:2012-07-11 22:10:02

标签: sql oracle plsql oracle10g plsqldeveloper

我想将refcursor转换为表类型,如下所示。下面的语法不能编译。目的是将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;    

感谢。

2 个答案:

答案 0 :(得分: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;
/

答案 1 :(得分:0)

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

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

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