Массовая коллекция с динамическим SQL - PullRequest
0 голосов
/ 26 июня 2019

У меня есть требование, когда я получаю имя таблицы и имя столбца динамически, мне нужно извлечь данные и вставить / обновить в таблице с помощью массового сбора. Насколько я проверял, я не смогу использовать FORALL для динамического sql, который использует динамическое имя таблицы / столбца. Пожалуйста, предложите любой обходной путь для вставки данных в коллекцию оптом


Declare 
   Type Type_xx is table of varchar2(200);

   Lv_Coll  type_xx:=type_xx();
   Lv_Coll2   sys_refcursor;
   Lv_tab   varchar2(200):='C_Sample_1';
   Lv_Col   Varchar2(200):='SHORT_NAME';
   Out_tab  Varchar2(200):='Test';

Begin
   OPEN Lv_Coll2 FOR  'Select '||Lv_Col||' from '||Lv_tab||'';
        Loop
            Fetch Lv_Coll2 bulk collect into Lv_Coll limit 100;
            Exit when Lv_Coll.count < 100;
            forall i in Lv_Coll.first..Lv_Coll.last 
                Execute Immediate 'insert into '||Out_tab||' values ('||Lv_Coll(i)||')';
           End loop;
end;

выдает ошибку

ORA-06550: строка 16, столбец 17:
PLS-00801: внутренняя ошибка [*** ASSERT в файле pdw4.c, строка 620; Неизвестное выражение Expr = 283 .; Xanon__0x2b21bbdd8__AB [16, 17]]

Версия базы данных: 11.2.0.4.0

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Возможно, это не предпочтительное решение, но вы можете поместить весь блок PL / SQL массовой вставки в инструкцию EXECUTE IMMEDIATE.

0 голосов
/ 27 июня 2019

Вот способ сделать это:

declare
 type t_ntt is table of test1%rowtype index by pls_integer;
 l_ntt t_ntt;
 c_limit INTEGER := 100;
 sqltext VARCHAR2(1000);
 table_name VARCHAR2(30) := 'test1';
 column_name VARCHAR2(30) := 'A';
 c_cursor sys_refcursor; 
begin
  open c_cursor for 'select '|| column_name|| ' from ' || table_name ;
  loop
    fetch c_cursor bulk collect into l_ntt limit c_limit;
    exit when l_ntt.count = 0;
    dbms_output.put_line(l_ntt.count);
    forall i in indices of l_ntt
    insert into test values l_ntt(i);

  end loop;
  close c_cursor;

end;

Я не сделал коммит на нем.

...