[Oracle] DBMS_OUTPUTパッケージを使用する際の問題解決法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

テーマ:
DBMS_OUTPUTパッケージは、ストアドプロシージャのデバッグなどの目的でよく使用します。

例えば、ストアドプロシージャの中に

DBMS_OUTPUT.PUT_LINE( 'COUNT=' || wk_count );


というようなデバッグコードを埋め込んでおけば、その時点での変数wk_countの値が画面に出力されます。

ただし、このDBMS_OUTPUTパッケージにはいろいろと制限があります。


そのため、多用する場合は制限にひっかからないようにうまく扱わなければなりません。



まず、SQL*PlusでDBMS_OUTPUTパッケージの出力を表示するには、事前に以下のSQL*Plusコマンドを実行しておく必要があります。

SET SERVEROUT ON


これを実行しておかなければ、DBMS_OUTPUTパッケージでいくらメッセージを出力しても画面には何も表示されません。


よく使うのであれば、サイトプロファイル(glogin.sql)、またはユーザープロファイル(login.sql)にこのコマンドを設定しておくといいでしょう。


また、1行に出力できる文字数は255文字に制限されており、255文字を超える場合、

ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line


が発生します。


これを回避して255文字以上のメッセージを出力したい場合は

DBMS_OUTPUT.PUT_LINE( SUBSTR( wk_text, 1, 255 );
DBMS_OUTPUT.PUT_LINE( SUBSTR( wk_text, 256, 255 );


として、255文字ずつ区切って出力するなどしなければなりません。


さらに、全体の出力量にも制限があり、出力量が2,000バイトを超える場合、

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes


が発生します。


これはDBMS_OUTPUTパッケージで使用するバッファサイズがデフォルト2,000バイトであるためで、これを回避するには

DBMS_OUTPUT.ENABLE( 1000000 );


として、バッファサイズを拡張する必要があります。


ただし、バッファサイズの最大は1,000,000バイトとなっているので、これを超えるようであれば、出力量を抑えるよう工夫をしなければなりません。


なお、バッファという言葉が出てきましたが、DBMS_OUTPUTパッケージは画面にいきなり出力するのではなく、一旦バッファに出力し、プログラムの実行終了後にバッファの内容を一気に画面に出力する仕様になっています。


そのため、プログラムの進行状況を逐次出力するといったような用途では使用できません。


ちなみに、このDBMS_OUTPUTパッケージ、一般的にはPUT_LINEまたはPUTを使ってメッセージを出力することがほとんどですが、逆にGET_LINEまたはGETを使ってバッファからメッセージを読み取ることもできます。


あまり利用できるシーンは想像できないですが、一応できると言うことを頭に入れておくといざそういうシーンになったときに使えるかもしれません。