ORA-29285:ファイル書き込みエラーは、Oracleデータベースでファイル処理操作を実行しているときに発生する可能性のあるエラーの1つです
ファイル処理操作は、オペレーティングシステム上に新しいファイルを作成し、それを更新または変更します。この関数は、ファイル操作のためにPLSQLで頻繁に使用されます
ORA-29285の理由と解決策
(1)ファイルを書き込んでいるUnix / Linuxファイルシステムがいっぱいです。つまり、100%使用されています。
df -h /u500 /u500 100 0 declare fileHandler UTL_FILE.FILE_TYPE; begin fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W'); UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test'); UTL_FILE.FCLOSE(fileHandler); end; / DECLARE * ERROR at line 1: ORA-29285: file write error ORA-06512: at "SYS.UTL_FILE", line 4 ORA-06512: at "SYS.UTL_FILE", line 1169 ORA-06512: at line 6
解決策
/ u500のスペースを解放すると、PLSQLブロックを再度確認できます
したがって、基本的には、使用されているファイルシステム内の不要なファイルをクリアする必要があります。現在使用中のファイルは削除しないでください。アクティブなファイルを削除すると、スペースは解放されません
df -h /u500 /u500 80 20 declare fileHandler UTL_FILE.FILE_TYPE; begin fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W'); UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test'); UTL_FILE.FCLOSE(fileHandler); end; / 2 3 4 5 6 PL/SQL procedure successfully completed.
(2)MAX_LINESIZEパラメータに値が指定されていない限り、FOPENによってファイルが開かれると、デフォルトで1024になります。したがって、このエラーは、行に1024文字を超える文字を入力した場合にも発生します
。DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); UTL_FILE.put_line(file_id, file_text); UTL_FILE.fclose(file_id); END; / DECLARE * ERROR at line 1: ORA-29285: file write error ORA-06512: at "SYS.UTL_FILE", line 2 ORA-06512: at "SYS.UTL_FILE", line 1169 ORA-06512: at line 6
解決策
最大行サイズを指定することで、このエラーを防ぐことができます
DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W',5000); UTL_FILE.put_line(file_id, file_text); UTL_FILE.fclose(file_id); END; / 2 3 4 5 6 PL/SQL procedure successfully completed.
MAX_LINESIZEパラメータは最大32767です。32Kより長い行がある場合は、データをバイナリとして書き込む必要があります。
(3)このエラーは、累積で1024を超える文字を書き込んでいるときに、ループ内でUTL_FILE.PUT_LINEを繰り返し呼び出すときに発生する可能性があります。理由が正しくないORA_NLS10の設定または変数ORA_NLS10が設定されていない
例
unset ORA_NLS10 sqlplus / as sysdba shutdown immediate startup sqlplus "/ as sysdba" DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); FOR x IN 1..11 LOOP -- write 11 records UTL_FILE.put_line(file_id, file_text); END LOOP; UTL_FILE.fclose(file_id); END; / ORA-29285: file write error
解決策
ORA_NLS10がOracleデータベースおよびリスナー環境に設定されていることを確認してください
ORACLE_SID=TEST ORA_NLS10=< > sqlplus / as sysdba shutdown immediate startup lsnrctl stop TEST lsnrctl start TEST sqlplus / as sysdba DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); FOR x IN 1..11 LOOP -- write 11 records UTL_FILE.put_line(file_id, file_text); END LOOP; UTL_FILE.fclose(file_id); END; / PL/SQL procedure successfully completed.
ORA-29285に関するこの詳細な投稿を気に入っていただければ幸いです。気に入ってフィードバックを提供してください
関連記事
ORA-29280:無効なディレクトリパス
ORA-29283:無効なファイル操作
ORA-00942テーブルまたはビューが存在しません
ORA-29913
OracleアプリにFND_FILE
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm