如何在PL/SQL代码的for循环中创建游标并将结果批量收集到表中

问题描述:

我有一个拥有相同表(由相同的表示相同列但数据不同)的许多用户组成的数据库。我想在这些表上运行相同的查询并将结果批量收集到临时表或其他任何查看方式。 到目前为止,我的代码如下所示:如何在PL/SQL代码的for循环中创建游标并将结果批量收集到表中

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上运行select语句并将结果推送到我创建的表中(COLLECTIONTBL)。我在这个论坛和其他地方搜索,看到我可以使用fetch命令执行此操作。但是,获取命令需要放在一个游标中,每次我把它放在一个循环中时就会出错。需要注意的是,我想将来自所有迭代的结果连接到COLLECTIONTBL

您需要使用execute immediate语句,它允许创建和运行动态SQL:

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

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