如何在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;