Приведение 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, безусловно, работает, если вы действительно хотите гибкость передачи имени исходной таблицы в виде строки.

Другие вопросы по тегам