PL/SQLの「SET SERVEROUTPUT ON SIZE」と改行コードの関係について教えてください。

1)1行に1文字の文字列を表示し改行し、それを1000回繰り返す場合、サイズが4001必要でした。
2)1行に4文字の文字列を表示し改行し、それを 500回繰り返す場合、サイズが2001必要でした。
文字の出力方式は「DBMS_OUTPUT.PUT_LINE」です。
上記1)はファイルサイズが2000(Byte)になります。2)のファイルは2500(Byte)になります。
(「PL/SQLプロシージャが正常に完了しました。」という文字列を出力しない場合)
何を目安に「SET SERVEROUTPUT ON SIZE」を決めればよいのでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/05/06 16:42:30
  • 終了:--

回答(2件)

id:warx No.1

warx回答回数22ベストアンサー獲得回数02004/05/06 17:54:44

ポイント25pt

Oracle社が配布しているPL/SQLパッケージ・プロシージャリファレンスのDBMS_OUTPUTパッケージ、サブプログラムの要約に含まれる「PUTおよびPUT_LINEプロシージャ」には次のように書かれています。

*PUTまたはPUT_LINEで作成した出力はバッファに入れられます。この出力は、それをバッファに入れたPL/SQLプログラム・ユニットがコール側に戻るまで取り出せません。

たとえば、Enterprise ManagerまたはSQL*Plusは、PL/SQLプログラムが完了するまでDBMS_OUTPUTメッセージを表示しません。

PL/SQL プログラム内でDBMS_OUTPUTバッファをフラッシュするメカニズムはありません。

SET SERVEROUTPUT ON SIZE xxxxxで指定したバッファサイズ(byte)や一行の長さの限界である255byteを超えない範囲でPUTやPUT_LINEを使う、という回答以外に何か書くとしたら、DBMS_OUTPUTはデバグ用に少量のちょっとした変数の内容を出力するのに用いるべきで、バッファ内容を考慮しながら使う、例えばログ出力などには別の手段を考えた方がいいということでしょうか。

id:smileless

ありがとうございます。

>超えない範囲でPUTやPUT_LINEを使う

もちろん、そのようにするのが正しい使い方だと思います。

しかし、なるべく最低限のサイズで設定したいと考えています。

(全てのプログラムで1000000以下には収まるようにしていますが、すべて1000000と設定するのにはちょっと抵抗があります。)

DB内容を加工してテキストファイルにCSV形式で保存したいのですが、Pro*Cに乗り換えずに何とかする方法を考えています。

引き続き、回答をお待ちしています。

2004/05/06 18:21:40
id:warx No.2

warx回答回数22ベストアンサー獲得回数02004/05/06 19:15:01

ポイント25pt

それなら組み込みパッケージUTL_FILEを利用してみてはいかがですか?

URLはUNIX-OSでのサンプルですが、アペンド時に問題が起こることに対処したものだそうです。

こちらはWindows版のパス記述をしています。これも参考になるでしょう。

これを使うことでプロシジャ内でバッファを切りなおすオーバヘッドも減るでしょうね。

DBMS_OUTPUTパッケージからUTL_FILEへの書き換えやテストに時間は食われると思いますが。:-)

id:smileless

ありがとうございます。

ためしてみます。

2004/05/07 10:53:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません