2011-08-26 23 views
5

Oracleストアド・プロシージャから7MBを超える大きなファイルを作成していますが、各レコードの最後に行終了文字(改行なし/改行なし)が必要です。Oracle PL/SQL UTL_FILE.PUTバッファリング

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

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

答えて

3

ダスティン、

ここでは、Oracleのマニュアル: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

のように述べている: FFLUSHは、物理的にファイルハンドルで識別されるファイルに、保留中のデータを書き込みます。通常、ファイルに書き込まれるデータはバッファされます。 FFLUSHプロシージャは、バッファされたデータを強制的にファイルに書き出します。データは改行文字で終わらなければなりません。

最後の文が最も適切です。

UTL_FILE.PUT_LINEを使用してデータを書き込む前に、結果のファイルで行終端記号を検索して削除することはできませんか?

だけの思考....ドキュメントから

+0

FFLUSHの仕組みを明確にしてくれてありがとうございました。私は検索で最後の文を見たことがありませんでした。 – Dustin

+0

こんにちは@Ollie、私はまだFFLUSHの仕組みについて、(1 - > 32767 + n)、私が置くたびに混乱しています。なぜ新しい行が必要なのでしょうか?説明するのを助けてくれますか? – Jaskey

4

削除見積もり、これを行うための別の可能な方法は、あなたは、フル機能の多くを使用することができますJavaストアド・プロシージャ、あるOllie第の答え

を見ますファイルの作成と書き込みを行うためのJava API。

+0

Javaストアドプロシージャの良いアイデア+1 – Ollie

+0

私はJavaストアドプロシージャに興味があります。私はJavaコードそのものは簡単だろうと信じていますが、私たちは店内でJavaコーディングを行っていないので、誰かが拾う必要があるメンテナンス上の問題です。 – Dustin

+0

この問題をBFILEオブジェクトで解決する方法について説明してください。 – Jaskey

0

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

0

すばらしい回答をいただき、ありがとうございました。 Javaのストアドプロシージャは、移動する方法のように見えましたが、社内に多くのJava専門知識を持っていないため、管理者がぶつかることになります。しかし、私はストアドプロシージャからこれを行う方法を見つけることができました。私はバイトモード 'WB'を書いてファイルを開く必要がありました。次に、ファイルに書き込んでいるレコードごとに、UTL_RAW.CAST_TO_RAWを使用してRAWデータ型に変換します。次に、UTL_FILE.PUT_RAWを使用してファイルに書き込み、続いてバッファをフラッシュするために必要なFFLUSHを呼び出します。受信側のシステムはファイルを読み取ることができました。ここまでは順調ですね。

関連する問題