如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中
Posted
技术标签:
【中文标题】如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中【英文标题】:How to create a cursor within for loop of PL/SQL Code and bulk collect results into table 【发布时间】:2016-12-20 20:04:22 【问题描述】:我有一个数据库,其中包含许多具有相同表的用户(相同的意思是相同的列但不同的数据)。我想对这些表运行相同的查询并将结果批量收集到临时表或任何其他查看方式中。 到目前为止,我的代码如下所示:
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 命令来做到这一点。但是,需要将 fetch 命令放在一个游标中,每次我将它放在一个循环中时都会出错。需要注意的是,我想将所有迭代的结果连接到COLLECTIONTBL
。
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用PL / SQL更改您在FOR循环IN子句中查询的表