如何从PL/SQL函数或过程内部访问Oracle系统表?

mju*_*ewu 5 sql oracle plsql ora-00942

我试图从函数中访问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;
/
Run Code Online (Sandbox Code Playgroud)

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

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: SQL Statement ignored
6/12     PL/SQL: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

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

SELECT file_name
    FROM dba_data_files
    WHERE tablespace_name='USERS'
    AND rownum=1;
Run Code Online (Sandbox Code Playgroud)

结果如下:

FILE_NAME
--------------------------------------------------------------------------------
/usr/lib/oracle/xe/oradata/XE/users.dbf
Run Code Online (Sandbox Code Playgroud)

有什么我需要做的不同吗?

Pet*_*ang 5

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

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