2016-12-20 14 views
1

У меня есть база данных со многими пользователями, которые имеют одну и ту же таблицу (по тому же я имею в виду те же столбцы, но разные данные). Я хотел бы запустить тот же запрос в этих таблицах и навалом собирать результаты во временную таблицу или любой другой способ просмотра. До сих пор я код, приведенный ниже:Как создать курсор внутри цикла 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, хранить полное имя таблицы включая имя пользователя успешно через каждую итерацию. Мой вопрос в том, как добавить запрос к приведенному выше коду, который запускает инструкцию select в переменной CompTblName и подталкивает результаты в созданную мной таблицу (COLLECTIONTBL). Я искал в этом форуме и других местах и ​​видел, что могу это сделать, используя команду fetch. Однако команда fetch должна быть помещена в курсор, который дает ошибку каждый раз, когда я помещаю его в цикле. Важно отметить, что я хотел бы объединить результаты всех итераций в COLLECTIONTBL.

ответ

0

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

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

    execute immediate 'insert into COLLECTIONTBL select * from ' || CompTblName; 
    END LOOP;