如何使用FOR循环查询Oracle SQL并返回表?

如何使用FOR循环查询Oracle SQL并返回表?,sql,oracle,Sql,Oracle,我们公司正在使用Oracle 11g(11.2.0.5.0) 我正在寻找一种执行外部查询(在这个从PHP网站调用的特定示例中)的方法,它将for循环遍历一组数据,并以表的形式返回结果(就像普通的SELECT一样) 用户表格: DB1 DB2 DB3 ... DBO ID CODE TYPE -------------------- 1 0001 A 2 0043 A 3 00A5 V ... 每个用户的架构包含项表: DB

我们公司正在使用Oracle 11g(11.2.0.5.0)

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

用户
表格:

DB1
DB2
DB3
...
DBO
ID     CODE     TYPE
--------------------
1      0001     A
2      0043     A
3      00A5     V
...
每个用户的架构包含
表:

DB1
DB2
DB3
...
DBO
ID     CODE     TYPE
--------------------
1      0001     A
2      0043     A
3      00A5     V
...
我想执行一个查询,该查询将遍历所有
用户
,并从他们的
表中获取数据,这与我不工作的原因类似

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
...

如果我正确理解您的需求,也许这可以帮助:

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;
/
我删除了所有_用户,因为可能有一些用户没有
ITEM_表
表,例如
SYS
;通过这种方式,您只能查询真正存在的表


第一部分通过连接来自不同用户的查询来动态构建所需的查询;在第二部分中,您将从所有表中提取数据,以便可以执行任何需要的操作。

您使用的是sql server还是oracle?(您的标题和描述不匹配!)
User_table
Item_table
之间的关系是什么?当然,您不需要为此循环我正在使用Oracle Database 11g 11.2.0.4.0-64位生产PL/SQL 11.2.0.4.0-Production“CORE 11.2.0.4.0生产”64位Windows的TNS:11.2.0.4.0版-生产版NLSRTL 11.2.0.4.0版-生产它不是
用户表
,它是
所有用户表
表(我猜从技术上讲它不是表)。表
Item_table
位于每个用户的个人表中。我已经更正了代码,它应该是user.Item_table,现在它更有意义了。我正在尝试让它工作,但这个解决方案不限于32767行吗?32767只是动态字符串大小的限制;如果您需要更多,请查看CLOBThanks。现在让我们假设我只希望脚本返回所有收集的数据。在您的示例中,我将如何做到这一点?如果您需要返回数据的函数或过程,可以使用OUT参数;如果只需要打印结果,您可以在数据结构
vTabCode
vTabUser
中循环,并使用
DBMS\u输出打印其内容。