Как создать курсор в цикле for кода PL/SQL и массово собрать результаты в таблицу

У меня есть база данных со многими пользователями, которые имеют одну и ту же таблицу (под одним и тем же я подразумеваю одни и те же столбцы, но разные данные). Я хотел бы запустить один и тот же запрос для этих таблиц и массово собрать результаты во временную таблицу или любой другой способ просмотра. Пока у меня есть код, показанный ниже:

DECLARE
  TYPE PDTABLE_12SEGTBL IS TABLE OF MTO_SG2420.PDTABLE_12%ROWTYPE;
  COLLECTIONTBL PDTABLE_12SEGTBL;
  LoopIteration pls_integer;
  CompTblName varchar2(61);

  CURSOR MTO_Cursor IS
    SELECT owner, table_name 
    FROM   ALL_TABLES 
    WHERE  OWNER LIKE 'MTO_K%' 
    AND    TABLE_NAME = 'PDTABLE_12';
BEGIN
  LoopIteration :=1;

  FOR item IN MTO_Cursor
  LOOP
    CompTblName := item.owner || '.pdtable_12';

    DBMS_OUTPUT.PUT_LINE('Loop Iteration ' || LoopIteration || ' CompTblName' || CompTblName);

    LoopIteration := LoopIteration + 1;
  END LOOP;
END;

Таблицы, для которых я хотел бы выполнить запрос, выглядят так:

MTO_K01.pdtable_12
MTO_K02.pdtable_12
MTO_K03.pdtable_12
MTO_K04.pdtable_12
MTO_K05.pdtable_12

В переменной CompTblName я успешно сохраняю полное имя таблицы, включая имя пользователя, на каждой итерации. Мой вопрос заключается в том, как я могу добавить запрос к приведенному выше коду, который запускает оператор выбора для переменной CompTblName и помещает результаты в созданную мной таблицу (COLLECTIONTBL). Я искал на этом форуме и в других местах и ​​увидел, что могу сделать это с помощью команды fetch. Однако команду fetch необходимо поместить в курсор, который выдает ошибку каждый раз, когда я помещаю ее в цикл. Важно отметить, что я хотел бы объединить результаты всех итераций в COLLECTIONTBL.


person PatStarks    schedule 20.12.2016    source источник


Ответы (1)


Вам нужно использовать оператор execute immediate, который позволяет создавать и запускать динамический SQL:

FOR item IN MTO_Cursor LOOP
    CompTblName := item.owner || '.pdtable_12';

    execute immediate 'insert into COLLECTIONTBL select * from ' || CompTblName;
  END LOOP;
person Dmitriy    schedule 20.12.2016