Oracle 在PL SQL游标中查询DBA_表和用户_表

Oracle 在PL SQL游标中查询DBA_表和用户_表,oracle,cursor,ora-00942,Oracle,Cursor,Ora 00942,我在PLSQL过程中有一个光标,可以从DBA\u表和USER\u表中进行选择 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; 然而,程序仍

我在PLSQL过程中有一个光标,可以从
DBA\u表
USER\u表
中进行选择

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表或视图不存在”


执行期间。

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

select * from user_tab_privs WHERE table_name = 'DBA_TABLES';
如果此查询返回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_表,请按照krokodilko回答中的步骤操作。如果需要查询多个数据字典对象,则
选择任何字典
权限是另一个选项。它授予对DBA视图(包括DBA_表)的select访问权。以系统身份登录并运行:

grant select any dictionary to your-username;
SELECT ANY DICTIONARY特权允许用户查询SYS架构中的任何数据字典对象,但以下对象除外:DEFAULT_PWD$、ENC$、LINK$、user$、user_HISTORY$和XS$验证器

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

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

执行过程的用户必须具有从此视图中进行选择的权限,除非该过程是使用AUTHID DEFINER子句创建的,在这种情况下,定义者(所有者)必须具有查询此视图的权限。向DBA请求适当的权限。我试图创建过程witj AUTHID DEFINER子句,但仍然出现相同的错误:创建或替换过程DB\U迁移AUTHID DEFINER AS