我想将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;
感谢。
答案 0 :(得分:1)
您可以使用bulk collect
和forall
代替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的答案肯定有效。