如何在PL / SQL循环中为不同的模式运行相同的SQL查询

时间:2015-12-03 10:19:07

标签: oracle plsql

假设我有三个模式: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

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

1 个答案:

答案 0 :(得分: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 不允许动态table_name ,它必须是静态。为了完成任务,您需要(ab)在PL / SQL块中使用 EXECUTE IMMEDIATE

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

然而,看看你正在做什么,我认为没有任何理由(ab)使用 EXECUTE IMMEDIAT E.简单使用 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