假设我有三个模式:A
,B
和C
。根据此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
提前感谢您收到的任何帮助。
答案 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