PL/SQL関数または手順の内部からOracleシステムテーブルにアクセスする方法は?

StackOverflow https://stackoverflow.com/questions/2602536

  •  25-09-2019
  •  | 
  •  

質問

関数内からOracle Meta-Dataテーブルから情報にアクセスしようとしています。たとえば、(意図的に簡素化):

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

私が違ったやり方をする必要があることはありますか?

役に立ちましたか?

解決

それを確認してください SELECT a 役割, 、しかし、ユーザーが実際に助成金を持っていること。役割による助成金はパッケージには適用されません。これを参照してください asktom.oracle.comに投稿します.

また、試してみてください sys.dba_data_files それ以外の dba_data_files.

他のヒント

付与者が他のユーザーや役割にオブジェクト権限を付与できるようにするための助成金オプションを指定します。

GRANT SELECT ON dba_data_files TO YOUR_USER WITH GRANT OPTION;

テーブル名のプレフィックスを試してみましたか sys. のように

FROM sys.dba_data_files

からデータを選択するため dba_data_files, 、sysユーザーからユーザーへの選択を許可します。例:

GRANT SELECT ON dba_data_files TO YOUR_USER;

その後、手順を再コンパイルします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top