6

Oracle ストアド プロシージャから 7MB を超える大きなファイルを書き込んでいますが、各レコードの末尾に改行文字 (キャリッジ リターン/ライン フィード) がないことが要件です。

UTL_FILE.PUT を使用してストアド プロシージャを作成し、UTL_FILE.PUT への呼び出しごとに UTL_FILE.FFLUSH を使用しています。この手順は、FFLUSH 呼び出しを行っているにもかかわらず、バッファー サイズ (最大 32767 に設定) を超えて書き込みを行った時点で、書き込みエラーでエラーになります。PUT 呼び出しを PUT_LINE 呼び出しに置き換えると、手順は正常に機能します。

改行文字なしでバッファサイズを超えて書き込むことはできませんか? もしそうなら、回避策はありますか?

4

4 に答える 4

4

ドキュメントから引用を削除しました。Ollieの回答を参照してください

これを行う別の可能な方法は、Javaストアドプロシージャです。この場合、よりフル機能のJava APIを使用して、ファイルを作成および書き込むことができます。

于 2011-08-26T14:55:01.253 に答える
4

Dustin,

The Oracle documentation here: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

States that: FFLUSH physically writes pending data to the file identified by the file handle. Normally, data being written to a file is buffered. The FFLUSH procedure forces the buffered data to be written to the file. The data must be terminated with a newline character.

The last sentence being the most pertinent.

Could you not write the data using UTL_FILE.PUT_LINE before then searching the resulting file for the line terminators and removing them?

Just a thought....

于 2011-08-26T14:51:30.877 に答える
1

望ましいとは言えませPUTんが、バッファ サイズに近づいていることを検出するまでは、いつでも実行できます。これが発生した場合、ファイル ハンドル (バッファのフラッシュ) を実行し、モードとして (追加)を使用しFCLOSEて同じファイルを再度開くことができます。繰り返しますが、この手法は通常、特に他のプロセスもファイルにアクセスしようとしている場合は避ける必要があります (たとえば、ファイルを閉じると、通常、プロセスがそのファイルに設定したロックが取り消され、ロックを取得しようとしていた他のプロセスが解放されます)。 )。FOPEN'a'

于 2011-08-27T12:17:06.357 に答える
0

素晴らしい回答をありがとう、とても役に立ちました。Java ストアド プロシージャは道のりのように見えましたが、社内に Java の専門知識があまりないため、経営陣から嫌われていました。しかし、ストアドプロシージャからこれを行う方法を見つけることができました。バイト書き込みモード「WB」でファイルを開く必要がありました。次に、ファイルに書き込むレコードごとに、UTL_RAW.CAST_TO_RAW を使用して RAW データ型に変換します。次に、UTL_FILE.PUT_RAW を使用してファイルに書き込み、続いて必要な FFLUSH 呼び出しを行ってバッファをフラッシュします。受信側システムはファイルを読み取ることができました。ここまでは順調ですね。

于 2011-08-30T11:33:23.237 に答える