Oracle 9i以降、UTL_FILEで使用するディレクトリを宣言する方法は2つあります。
古い方法は、INIT.ORAパラメーターUTL_FILE_DIRを設定することです。変更を有効にするには、データベースを再起動する必要があります。この値は、他のPATH変数と同じように使用できます。ワイルドカードを受け入れます。このアプローチを使用することは、ディレクトリパスを渡すことを意味します...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
別のアプローチは、ディレクトリオブジェクトを宣言することです。
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
ディレクトリオブジェクトには正確なファイルパスが必要であり、ワイルドカードは使用できません。このアプローチでは、ディレクトリオブジェクト名を渡します...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
UTL_FILE_DIRは本質的に安全ではないため、非推奨になっています。すべてのユーザーがパスで指定されたすべてのOSディレクトリにアクセスできますが、読み取りと書き込みの権限は個々のユーザーに個別に付与できます。また、Directoryオブジェクトを使用すると、データベースをバウンスせずにディレクトリを追加、削除、または変更できます。
いずれの場合も、oracle
OSユーザーは、OSディレクトリに対して読み取りおよび/または書き込み権限を持っている必要があります 。明らかでない場合、これはディレクトリがデータベースサーバーから見える必要があることを意味します 。したがって、どちらのアプローチを使用しても、ローカルPC上のディレクトリをリモートデータベースサーバーで実行されているプロセスに公開することはできません。ファイルは、データベースサーバーまたは共有ネットワークドライブにアップロードする必要があります。
oracle
の場合 OSユーザーがOSディレクトリに対する適切な権限を持っていないか、データベースで指定されたパスが実際のパスと一致しない場合、プログラムはこの例外をスローします:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
このエラーのOERRテキストは非常に明確です:
29283 - "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.