Приведение ref-курсора в табличный тип в pl-sql
Я хотел бы привести прекурсор в табличный тип, как показано ниже. Синтаксис ниже не компилируется. Цель состоит в том, чтобы получить результаты рефкурсора во временную таблицу, а затем выполнить некоторую работу с этой таблицей.
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 ответа
Ты можешь использовать 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;
/
Если вы знаете имена ваших таблиц во время компиляции, я не понимаю смысла использования курсора REF? Почему бы просто не иметь свой анонимный блок как:
BEGIN
INSERT INTO temptable1 SELECT * FROM vtest1;
COMMIT;
END;
Ответ GWU, безусловно, работает, если вы действительно хотите гибкость передачи имени исходной таблицы в виде строки.