如何在 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 循环中执行即时异常处理

pl / sql如何使用带有游标的for循环进行更新操作

PL/SQL 中的 for 循环和列

如何使用PL / SQL更改您在FOR循环IN子句中查询的表

为啥我在 PL/SQL 中的 for 循环没有打印出最后一次迭代

for循环后的最后一个过程语句在pl sql中不起作用