SELECT OBJECT_NAME
FROM ALL_OBJECTS || '@' || :db
WHERE OWNER = :schema
AND (
OBJECT_TYPE = 'TABLE'
OR OBJECT TYPE = 'VIEW'
OR OBJECT_TYPE = 'SYNONYM'
)
ORDER BY OBJECT_NAME
如果你想让它动态化,那么你需要(ab)在PL/SQL中使用EXECUTE IMMEDIATE。您需要动态准备字符串,然后执行它。
例如,在SQL*Plus中:
var db varchar2(30);
var schema varchar2(30);
exec :db := 'database_name'
exec :schema := 'OWNER'
SET serveroutput ON
DECLARE
v_sql VARCHAR2(2000);
v_object_name VARCHAR2(30);
BEGIN
v_sql:= 'SELECT OBJECT_NAME
FROM ALL_OBJECTS@'||:db||' WHERE OWNER = :schema
AND (
OBJECT_TYPE = ''TABLE''
OR OBJECT_TYPE = ''VIEW''
OR OBJECT_TYPE = ''SYNONYM''
)
ORDER BY OBJECT_NAME';
dbms_output.put_line(v_sql);
execute immediate v_sql into v_object_name using :db, :schema;
END;
/
或者,您可以将DATABASE LINK作为静态名称:
首先我创建数据库链接:
SQL> CREATE DATABASE LINK TEST
2 CONNECT TO SCOTT IDENTIFIED BY tiger USING 'pdborcl';
Database link created.
在tnsnames.ora文件中添加了以下条目:
test =
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=ocalhost)(PORT=1521))
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME=pdborcl.in.oracle.com)
)
)
让我们在SQL*Plus中执行:
SQL> var schema varchar2(30);
SQL> exec :schema := 'SCOTT'
PL/SQL procedure successfully completed.
SQL> SELECT OBJECT_NAME
2 FROM ALL_OBJECTS@test
3 WHERE OWNER = :schema
4 AND (
5 OBJECT_TYPE = 'TABLE'
6 OR OBJECT_TYPE = 'VIEW'
7 OR OBJECT_TYPE = 'SYNONYM'
8 )
9 ORDER BY OBJECT_NAME
10 /
OBJECT_NAME
------------------------------------------------------------
BONUS
DEPT
EMP
EMP_VIEW
SALGRADE