在 PL SQL 游标中查询 DBA_TABLES 和 USER_TABLES

Query DBA_TABLES and USER_TABLES in PL SQL cursor

我在 PLSQL 过程中有一个游标,从 DBA_TABLES 到 select 和 USER_TABLES

CURSOR c1 IS
  SELECT DISTINCT(DB.TABLE_NAME) FROM DBA_TABLES DB, USER_TABLES UT WHERE DB.TABLE_NAME = UT.TABLE_NAME AND DB.IOT_TYPE IS NOT NULL;

BEGIN
  OPEN c1;
  FETCH c1  INTO IOT_TABLE;
  CLOSE c1;

但是程序报错

"ORA-00942 Table or View does not exist"

执行中。

用户必须对该视图具有 SELECT 权限。
要检查用户是否具有针对此视图的 SELECT 权限,请以此用户身份登录并 运行 以下查询:

select * from user_tab_privs WHERE table_name = 'DBA_TABLES';

如果此查询 returns none,则用户无权查看该视图。


为了将此权限授予该用户,请以 SYS 或 SYSTEM 身份登录,然后发出:

GRANT select ON DBA_TABLES TO username;

在此之后,用户应该会看到如下所示的结果,并且可以访问该视图:

select table_name, privilege from user_tab_privs WHERE table_name = 'DBA_TABLES';

TABLE_NAME PRIVILEGE                               
---------- ---------
DBA_TABLES SELECT                                  

如果您只需要 DBA_TABLES,请按照 krokodilko 的回答中的步骤进行操作。如果您需要查询多个数据字典对象,则 SELECT ANY DICTIONARY 权限是另一种选择。它授予 select 访问 DBA 视图的权限(包括 DBA_TABLES)。以 SYSTEM 身份登录并 运行:

grant select any dictionary to your-username;

SELECT ANY DICTIONARY 权限允许用户查询 SYS 模式中的任何数据字典对象,但以下对象除外:DEFAULT_PWD$、ENC$、LINK$、 USER$、USER_HISTORY$ 和 XS$VERIFIERS。

顺便说一句,问题中的 c1 游标可能不需要访问 DBA_TABLES。以下查询应产生相同的结果:

CURSOR c1 IS
  SELECT TABLE_NAME FROM USER_TABLES WHERE IOT_TYPE IS NOT NULL;