PL/SQL関数または手順の内部からOracleシステムテーブルにアクセスする方法は?
質問
関数内から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;
その後、手順を再コンパイルします。
所属していません StackOverflow