sql >> データベース >  >> RDS >> Oracle

UTL_FILE.FOPEN()プロシージャがディレクトリのパスを受け入れていませんか?

    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.
    


    1. PostgreSQLでOracleデータベースにアクセスする方法

    2. Oracle DBに接続するときに、ネットワークアダプタが接続を確立できませんでした

    3. OracleStreamsによってキャプチャされるサポートされていないテーブルを除外する

    4. PostgreSQLで日付スタイルを変更するにはどうすればよいですか?