web-dev-qa-db-ja.com

ORA-29283:無効なファイル操作ORA-06512: "SYS.UTL_FILE"、536行目

以下は、テーブルからフラットファイルにデータを抽出するために使用するコードです。

BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

このコードは開発データベースで正常に機能していますが、新しいDBで実行すると、以下のエラーがスローされます。

Error starting at line 1 in command:
    BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

Error report:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
29283. 00000 -  "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.

Oracle directory 'SEND' points to some UNIX directory which has rights as 
       'rwxrwsr-x' (Octal 2775)
Oracle Version:11g

この問題の解決を手伝ってください。

この質問を解決するために私からのより多くのデータが必要な場合は、ぜひお知らせください。

7
Vivek

そのため、@ Vivekは実際の回答ではなく、コメントのダイアログを通じて問題の解決策を得ています。

「ファイルはユーザーOracleによって作成されています。開発データベースでこれに気づきました。ファイルを作成しようとしたディレクトリにothersおよびユーザーOracleothersカテゴリに属します。 "

SOはQ&Aサイトであり、フォーラムではありませんか?ええと、私、とりわけ。)とにかく、この質問への承認された回答がない場合、 UTL_FILE.FOPEN()のトピック ここで検索

追伸私はこの回答にコミュニティWikiとマークを付けています。これは、この質問に対する適切な回答ではなく、どこかにリダイレクトするためです。

5
APC

table.txt」という名前のファイルが事前定義されたディレクトリにすでに作成されていると想定します

  • 1)ファイルの所有権を変更します。

    Sudo chown username:username table.txt
    
  • 2)ファイルのモードを変更する

    Sudo chmod 777 table.txt
    

今、それがうまくいくか試してください!

0
kuldeep

Windowsでは、ファイルがEFSを使用して暗号化されていないかどうかも確認してください。ファイルを手動で復号化するまで、同じ問題が発生しました。

0
Khamyl

私はこの問題に2日間直面しており、Oracleで作成したディレクトリも最初に物理ディスクに作成する必要があることに気付きました。

この点については、解決策を調べようとしてどこにも言及されていませんでした。

ディレクトリを作成した場合は、「DB_DIR」としましょう。

CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';

次に、DB_WORKSE:\ドライブに存在していること、およびファイルシステムレベルの読み取り/書き込み権限がOracleプロセスで利用可能であることを確認する必要があります。

私の経験からのUTL_FILEの私の理解は、この種の操作のために以下に与えられます。

UTL_FILEは、SYSユーザーのオブジェクトです。 SYS.UTL_FILEの実行をPUBLICに付与します。 SYSとしてログインしているときに指定する必要があります。そうしないと、プロシージャで宣言エラーが発生します。次のように誰でもディレクトリを作成できます:-CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\ DBWORKS';ただし、CREATE DIRECTORY権限を設定する必要があります。これは、次のように付与できます:-GRANT CREATE ALL DIRECTORY TOユーザー; SYSユーザーとしてログインしている場合。ただし、これを別のユーザーが使用する必要がある場合は、そのユーザーに権限を付与する必要があります。それ以外の場合は、エラーがスローされます。GRANTREAD、WRITE、EXECUTE ON DB_DIR TO user; whileディレクトリを作成したユーザーとしてログインします。次に、パッケージをコンパイルします。手順を実行する前に、ディレクトリがディスク上に物理的に存在することを確認してください。それ以外の場合は、「無効なファイル操作」エラーがスローされます。(V。重要)ファイルシステムレベルを確認してくださいOracleプロセスに読み取り/書き込み権限が設定されています。これは、付与されたDBレベルの権限とは異なります。(V。重要)実行プロシージャ。ファイルには、クエリの結果セットが読み込まれます。

0