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

ループでutl_file.putを呼び出すときのUTL_FILE.WRITE_ERROR

    1. 使用しているOracleバージョンを投稿してください。または、推測することもできます...

    2. fflush 期待どおりに機能しません-ドキュメント> :

      FFLUSHは、ファイルハンドルで識別されるファイルに保留中のデータを物理的に書き込みます。通常、ファイルに書き込まれるデータはバッファリングされます。 FFLUSHプロシージャは、バッファリングされたデータをファイルに強制的に書き込みます。 データは改行文字で終了する必要があります。

    3. tboneは絶対に正しいですTO_CHAR(10)の行は間違っています! SELECT TO_CHAR(10) FROM DUAL;を試してみてください 10を取得します 次に、これを1つの文字と比較します。 10には2つの文字があるため、1つの文字が「10」になることはありません!

    4. 問題は、XMLファイルが大きすぎるバッファオーバーフローである可能性が高いですが、ターゲットシステム上の他の問題もwrite_errorsにつながる可能性があることに注意してください。これは、処理する必要があります。

    ソリューション

    • クイック&ダーティ :とにかくパフォーマンスを気にしないようですので、Xバイトごとにファイルを閉じて、追加のためにAで再度開くことができます。したがって、ループに追加するだけです:

      IF MOD( l_offset, 32000 ) = 0
      THEN
        UTL_FILE.FCLOSE( f_out );
        UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 );
      END IF;
      
    • 適切な仕事に適切なツールを使用する:UTL_FILE 複雑なデータの処理には適していません。 UTL_FILEの唯一のユースケースは、改行で区切られた小さなテキスト行です。それ以外の場合は、RAWバイトを書き込む必要があります。 (これにより、現在はミニバニリーラッキーゲスであるENCODINGをより適切に制御することもできます)

    • NIO-Filechannelsを使用してJavaストアドプロシージャを作成します-高速、安全、優れています...ただし、プログラムは10倍の速度で実行される可能性があることに注意してください!



    1. ハウツー:Grails 3.0.2 + Oracle Database 12c?

    2. 文字列フィールドのOraclenullチェック

    3. データベースのハードウェアとインフラストラクチャの傾向

    4. ターゲット行だけでなく、すべてのmysql行に空の値が追加されます