【问题标题】:How to query Oracle SQL using FOR LOOP and get table returned?如何使用 FOR LOOP 查询 Oracle SQL 并返回表?
【发布时间】:2016-02-29 16:38:59
【问题描述】:

我们公司使用的是Oracle 11g (11.2.0.5.0)

我正在寻找一种方法来执行外部查询(在这个从 PHP 网站调用的特定示例中),它将通过一组数据进行 FOR LOOP 并以表的形式返回结果(就像普通的 SELECT 一样)

USERS表:

DB1
DB2
DB3
...
DBO

每个用户的架构都包含ITEM 表:

ID     CODE     TYPE
--------------------
1      0001     A
2      0043     A
3      00A5     V
...

我想执行一个查询,该查询将遍历所有 USERS 并从他们的 ITEM 表中获取数据,这与我的不工作类似

FOR user IN (SELECT * FROM all_users)
LOOP
   SELECT CODE, user FROM user.ITEM_TABLE WHERE TYPE = 'V'
END LOOP;

那会返回

CODE     USER
-------------
00A5     DB1
0434     DB2
0999     DB2
...

【问题讨论】:

  • 你用的是sql server还是oracle? (您的标题和描述不匹配!)
  • User_tableItem_table 之间的关系是什么,绝对不需要 LOOP
  • 我正在使用 Oracle Database 11g 版本 11.2.0.4.0 - 64 位生产 PL/SQL 版本 11.2.0.4.0 - 用于 64 位 Windows 的生产“CORE 11.2.0.4.0 生产”TNS : 版本 11.2.0.4.0 - 生产 NLSRTL 版本 11.2.0.4.0 - 生产
  • 这不是User_table,而是all_users 表(我猜从技术上讲这不是表)。表 Item_table 位于每个用户的个人表中。
  • 我已经更正了代码,应该是 user.ITEM_TABLE,现在更有意义了。

标签: sql oracle


【解决方案1】:

如果我正确理解您的需求,也许这会有所帮助:

declare
    type tabUser is table of varchar2(30);
    type tabCode is table of varchar2(30);
    vTabCode tabCode;
    vTabUser tabUser;
    vSQL varchar2(32767);
begin

    select listagg('select code, ''' || owner || ''' from ' || owner || '.item_table where type = ''V''', ' UNION ALL ')
    within group (order by owner)
    into vSQL
    from dba_tables where table_name = 'ITEM_TABLE';
    --
    dbms_output.put_line(vSQL);
    --
    execute immediate vSQl bulk collect into vTabCode, vTabUser;
    --
    /* ... what you need to do with your data */
end;
/

我删除了 all_users,因为可能有些用户没有ITEM_TABLE 表,例如SYS;这样,您只查询真正存在的表。

第一部分通过连接来自不同用户的查询来动态构建您需要的查询;在第二部分中,您从所有表中提取数据,因此您可以做任何您需要的事情。

【讨论】:

  • 我正在尝试让它工作,但这个解决方案不限于 32767 行吗?
  • 32767 只是动态字符串大小的限制;如果您需要更多,请查看 CLOB
  • 谢谢。现在假设我只想让脚本返回所有收集的数据。在你的例子中我会怎么做?
  • 如果需要函数或过程返回数据,可以使用OUT参数;如果你只是需要打印结果,你可以循环遍历数据结构vTabCodevTabUser并用DBMS_OUTPUT打印它们的内容。
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多