6

我正在尝试从函数中访问 Oracle 元数据表中的信息。例如(有意简化):

CREATE OR REPLACE PROCEDURE MyProcedure
IS
    users_datafile_path VARCHAR2(100);
BEGIN
    SELECT file_name INTO users_datafile_path
        FROM dba_data_files
        WHERE tablespace_name='USERS'
        AND rownum=1;
END MyProcedure;
/

当我尝试在 sqlplus 进程中执行此命令时,出现以下错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: SQL Statement ignored
6/12     PL/SQL: ORA-00942: table or view does not exist

我知道用户可以访问该表,因为当我从同一个 sqlplus 进程执行以下命令时,它会显示预期的信息:

SELECT file_name
    FROM dba_data_files
    WHERE tablespace_name='USERS'
    AND rownum=1;

结果是:

FILE_NAME
--------------------------------------------------------------------------------
/usr/lib/oracle/xe/oradata/XE/users.dbf

我需要做些不同的事情吗?

4

4 回答 4

5

确保SELECT不仅是通过角色授权,而且用户实际上拥有授权。按角色授予的权限不适用于包。请参阅asktom.oracle.com 上的这篇文章

另外,尝试sys.dba_data_files代替dba_data_files.

于 2010-04-08T18:48:14.180 回答
1

指定 WITH GRANT OPTION 以使被授权者能够将对象权限授予其他用户和角色。

GRANT SELECT ON dba_data_files TO YOUR_USER WITH GRANT OPTION;
于 2015-10-28T17:04:14.973 回答
0

您是否尝试过在表名前加上sys.as in

FROM sys.dba_data_files
于 2010-04-08T18:49:53.477 回答
-1

要从 中选择数据dba_data_files,请将选择从 SYS 用户授予 USER。例子:

GRANT SELECT ON dba_data_files TO YOUR_USER;

之后重新编译你的程序。

于 2012-03-05T23:22:13.990 回答