以下は、テーブルからフラットファイルにデータを抽出するために使用するコードです。
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
この問題の解決を手伝ってください。
この質問を解決するために私からのより多くのデータが必要な場合は、ぜひお知らせください。
そのため、@ Vivekは実際の回答ではなく、コメントのダイアログを通じて問題の解決策を得ています。
「ファイルはユーザー
Oracle
によって作成されています。開発データベースでこれに気づきました。ファイルを作成しようとしたディレクトリにothers
およびユーザーOracle
はothers
カテゴリに属します。 "
SOはQ&Aサイトであり、フォーラムではありませんか?ええと、私、とりわけ。)とにかく、この質問への承認された回答がない場合、 UTL_FILE.FOPEN()
のトピック ここで検索 。
追伸私はこの回答にコミュニティWikiとマークを付けています。これは、この質問に対する適切な回答ではなく、どこかにリダイレクトするためです。
「table.txt
」という名前のファイルが事前定義されたディレクトリにすでに作成されていると想定します
1)ファイルの所有権を変更します。
Sudo chown username:username table.txt
2)ファイルのモードを変更する
Sudo chmod 777 table.txt
今、それがうまくいくか試してください!
Windowsでは、ファイルがEFSを使用して暗号化されていないかどうかも確認してください。ファイルを手動で復号化するまで、同じ問題が発生しました。
私はこの問題に2日間直面しており、Oracleで作成したディレクトリも最初に物理ディスクに作成する必要があることに気付きました。
この点については、解決策を調べようとしてどこにも言及されていませんでした。
ディレクトリを作成した場合は、「DB_DIR
」としましょう。
CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';
次に、DB_WORKS
がE:\
ドライブに存在していること、およびファイルシステムレベルの読み取り/書き込み権限が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。重要)実行プロシージャ。ファイルには、クエリの結果セットが読み込まれます。