【问题标题】:Append the output of Oracle PL/SQL block Loop into one table将 Oracle PL/SQL 块 Loop 的输出追加到一张表中
【发布时间】:2017-08-29 04:27:23
【问题描述】:

我对 SQL 有非常初级的了解,并且尝试了几天来完成这项工作,但不幸的是没有运气。

我有一个这样的 PL/SQL 块代码..

BEGIN
For i in (SELECT 'SELECT * FROM ' || ACTIVE_POD || '.userservice' AS QUERY
FROM active_tables) loop
dbms_output.put_line(i.query);
end loop;
END;

这将输出

SELECT * FROM DB1.userservice
SELECT * FROM DB2.userservice
....
SELECT * FROM DB99.userservice

我想要得到的是将上述所有查询输出合并到一个表中。例如)假设上述输出的并集将是三个整数列

    ID |item_code|type
    10 | 2       |1001
    91 | 2       |1005
    10 | 2       |1011

我将不胜感激这方面的任何指导。谢谢!

【问题讨论】:

  • 可能你来自 MSSQL,在 Oracle 中它不起作用,你必须发明一种最适合你需要的解决方法,@wolfrevokcats 答案是一种选择。

标签: oracle loops plsql


【解决方案1】:

为组合语句声明一个变量:

declare l_stmt varchar2(32767);
begin
...

在循环内连接语句如下:

l_stmt:=l_stmt|| case when l_stmt is not null then chr(10)||' union all ' end||i.query;

然后execute immediate

execute immediate 'insert into your_table select * from ('||l_stmt||')';

生成的语句如下所示

insert into your_table select * from (
SELECT * FROM DB1.userservice 
union all SELECT * FROM DB2.userservice
...
union all SELECT * FROM DB99.userservice)           

另一种方法是使用流水线函数。

【讨论】:

  • 我是全新的,不确定确切的顺序,但最终也完成了这项工作。谢谢!
【解决方案2】:

如果你只需要生成器,你可以使用这个生成器,由我专门为这个任务编写(不要忘记更改 SELECTs):

DECLARE
   qry   VARCHAR2 (1000);
   chk   NUMBER := 0;
BEGIN
   qry := 'insert into your_table ';

   FOR rec
      IN (SELECT 'SELECT * FROM ' || ACTIVE_POD || '.userservice' AS stmnt
            FROM active_tables)
   LOOP
      IF chk <> 0
      THEN
         qry := qry || ' union all' || rec.stmnt;
      ELSE
         qry := qry || rec.stmnt;
      END IF;

      chk := chk + 1;
   END LOOP;

   qry := qry || ';';
   DBMS_OUTPUT.put_line (qry);
END;

但是,请注意,PL/SQL 中有一些更酷的特性和技术,可以根据任务更快更好地完成这项工作。

【讨论】:

  • 感谢您的帮助!再问一个问题,我将原始查询中的 'IN (SELECT ~ DUAL)' 替换为 'in (SELECT 'SELECT * FROM ' || ACTIVE_POD || '.userservice' AS QUERY FROM active_tables)'。我错过了 DUAL 吗?即使我添加了“stmnt varchar2(32767);”,我也得到“PLS-00302:必须声明组件“STMNT”的错误。开始之前。
  • 我觉得它真的越来越近了,但即使尝试了各种不同的尝试,也无法完成这项工作-.-;
  • 没有。问题出在“QUERY”别名中。我已经编辑了脚本。再试一次。
  • 哦,我明白了..谢谢!我更改了别名,但没有看到任何错误,但表是空的,运行查询后我什么也没看到..(我也添加了 'SET serveroutput ON;',但没有更改。)你能建议我在哪里可以看?非常感谢您的帮助 -)
  • 已经很晚了,但我尝试了不同的方法,最终发现问题出在我的数据库设置中(在我清理了一堆表后它起作用了)。非常感谢您的帮助,我学到了很多东西!
【解决方案3】:

Oracle 有处理动态 SQL 的特殊包。 也许这个链接会有所帮助https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS68199

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多