【问题标题】:How to run the same SQL query for different schemas in PL/SQL loop如何在 PL/SQL 循环中为不同的模式运行相同的 SQL 查询
【发布时间】:2016-03-07 21:46:01
【问题描述】:

假设我有三个模式:ABC。根据这个 Oracle 文档Syntax for Schema Objects and Parts in SQL Statements,引用对象的一般语法是:

schema.object

例如:

hr.departments

其中hr 是架构(所有者),departments 是对象(即表)。

我需要在 PL/SQL 块内的 SQL 查询中使用不同的模式名称。换句话说,我需要运行完全相同的 SQL 查询,但针对不同的架构(所有者)。

到目前为止,我有以下 PL/SQL 代码:

set serveroutput on size unlimited
set head off
set feedback off
set echo off

DECLARE
    i_schema VARCHAR2(100);

BEGIN
  FOR r IN (SELECT username FROM dba_users where username in ('A', 'B', 'C') order by 1)
  LOOP
    i_schema := r.owner || '.' || 'TABLE_NAME';
    dbms_output.put_line(chr(10) || 'SCHEMA ===> ' || i_schema );
    FOR t IN (SELECT * FROM i_schema order by 2)
    LOOP
        dbms_output.put_line(RPAD(t.COLUMN1,75) || '|' || t.COLUMN2);
    END LOOP;
   END LOOP;
END;
/

在第 14 行我也尝试了不同的符号:

FOR t IN (SELECT * FROM "r.username".TABLE_NAME ORDER BY 2)

但在这两种情况下我都得到以下错误:

PL/SQL: ORA-00942: table or view does not exist

提前感谢您收到的任何帮助。

【问题讨论】:

  • 你的最终要求是什么?请详细说明。你要达到的目标

标签: oracle plsql


【解决方案1】:
FOR r IN (SELECT username FROM dba_users where username in ('A', 'B', 'C') order by 1)
  LOOP
    i_schema := r.owner || '.' || 'TABLE_NAME';
    dbms_output.put_line(chr(10) || 'SCHEMA ===> ' || i_schema );
    FOR t IN (SELECT * FROM i_schema order by 2)
    LOOP
        dbms_output.put_line(RPAD(t.COLUMN1,75) || '|' || t.COLUMN2);
    END LOOP;
   END LOOP;

您不能这样做,因为 SQL 不允许 dynamic table_name,它必须是 static。为了完成任务,您需要(ab)在您的 PL/SQL 块中使用 EXECUTE IMMEDIATE

声明一个字符串类型变量,准备动态查询并将其分配给字符串变量。

但是,看看你在做什么,我认为没有任何理由(ab)使用 EXECUTE IMMEDIATE。简单地使用 REFCURSOR

但我认为这一切都是毫无意义的,因为无论如何你都是 硬编码 模式名称,所以编写 PL/SQL 有什么意义当您可以在 纯 SQL 中的 3 个 SQL 查询中完成时编写代码。使用一个好的文本编辑器在 3 个 SQL 中替换模式名称几乎不会花费不到一分钟的时间。

使用UNION ALL

SELECT RPAD(t.COLUMN1,75) || '|' || t.COLUMN2 FROM A.tablle_name t
UNION ALL
SELECT RPAD(t.COLUMN1,75) || '|' || t.COLUMN2 FROM B.tablle_name t
UNION ALL
SELECT RPAD(t.COLUMN1,75) || '|' || t.COLUMN2 FROM C.tablle_name t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2014-09-19
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多