1

最近、DB のバージョンを Oracle 11G に更新しました。その瞬間から、ファイルへの書き込みは失敗します。

私のコード:

UTL_FILE.FOPEN('/tmp', 'file.txt', 'w');

「ora-29280無効なディレクトリパス」が表示されました

Oracle DIRECTORY (「ディレクトリの作成...」) で使用する必要があることはわかっていますが、Oracle 10G では明示的なパスでうまく機能し、コードを変更したくありません。

ありがとう。

4

1 に答える 1

4

いいえ、できません..ドキュメントはそれを言います!

回避策は、/tmp に ALL_DIRECTORIES を使用してから、FOPEN で使用することです。

SELECT DIRECTORY_NAME INTO MY_DIR FROM ALL_DIRECTORIES WHERE DIRECTORY_PATH='/tmp';

UTL_FILE.FOPEN(MY_DIR, 'file.txt', 'w');

セキュリティ上の懸念から、Oracle はファイル パスを直接サポートしていないようです。

ディレクトリは事前に適切に作成する必要があります。

CREATE OR REPLACE DIRECTORY TEMP AS '/tmp'
/

GRANT READ, WRITE ON DIRECTORY TEMP TO MYUSER
/

要求されたフル パスの要求された DB ディレクトリ名を返す関数を作成できます。利用できない場合は、デフォルトのディレクトリ名を返します。

編集: UTL_FILE_DIRは、ハードコードされたディレクトリ パスに使用できます。INIT.ORA パラメータにこれらのディレクトリ パスが指定されている場合。それ以外の場合は、追加する必要があり、データベースをバウンスする必要があります。

以下のリンクには、それを使用する方法に関するいくつかの有用な情報と、ハードコードされたパスの代わりにディレクトリ オブジェクトを使用する利点があります。

http://www.otnblogs.com/using-oracle-directories-instead-utl_file_dir/

于 2014-09-17T21:11:40.753 に答える