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

ORA-29285の解決方法:ファイル書き込みエラー

    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


    1. 私のVARCHAR(MAX)フィールドは4000で上限を設定しています。何が得られますか?

    2. 日付のHibernate基準

    3. Postgresのhave句でselect集計列エイリアスを参照する

    4. Sqliteでの挿入クエリの問題?(変数挿入)