DBMS_OUTPUTパッケージを使用すると、ストアド・プロシージャおよびパッケージからメッセージを送信できます。このパッケージは、PL/SQLデバッグ情報を表示する場合に特に役立ちます。
この章の内容は次のとおりです。
概要
操作上のノート
ルールおよび制限
例外
例
表タイプ
この項では、DBMS_OUTPUTパッケージの使用に関連するトピックについて説明します。
このパッケージのPUTプロシージャおよびPUT_LINEプロシージャを使用すると、別のプロシージャまたはパッケージが読み取ることができるバッファに情報を格納できます。GET_LINEプロシージャおよびGET_LINESプロシージャをコールすると、バッファされた情報を個別のPL/SQLプロシージャまたは無名ブロックで表示できます。
パッケージを無効にすると、サブプログラムへのすべてのコールが無視されます。このようにして、クライアントが情報を処理できる場合にのみサブプログラムを使用できるようにアプリケーションを設計できます。
GET_LINEをコールしない場合、またはttIsqlの画面にメッセージを表示しない場合、バッファに入れたメッセージは無視されます。
ttIsqlユーティリティは、SQL文または無名PL/SQLコールを発行した後、GET_LINESをコールします。
ttIsqlでSET SERVEROUTPUT ONを入力すると、次と同じ効果があります。
DBMS_OUTPUT.ENABLE (buffer_size => NULL);
出力に制限はありません。
一般に、アプリケーション・コードでDISABLEプロシージャまたはENABLEプロシージャを起動させると、出力を表示するかどうかを制御する、ttIsqlなどの外部ツールの試行が妨害されるため、アプリケーション・コードでは起動させないでください。
|
ノート: DBMS_OUTPUTを使用して送信されるメッセージは、送信中のサブプログラムが完了するまで、実際には送信されません。プログラムの実行中に出力をフラッシュするメカニズムはありません。 |
通常、DBMS_OUTPUTパッケージは、ストアド・プロシージャまたはファンクションのデバッグに使用されます。
このファンクションは、HRスキーマのemployees表を問い合わせ、指定した部門の合計給与を戻します。ファンクションには、PUT_LINEプロシージャへのコールが含まれています。
CREATE OR REPLACE FUNCTION dept_salary (dnum NUMBER) RETURN NUMBER IS
CURSOR emp_cursor IS
select salary, commission_pct from employees where department_id = dnum;
total_wages NUMBER(11, 2) := 0;
counter NUMBER(10) := 1;
BEGIN
FOR emp_record IN emp_cursor LOOP
emp_record.commission_pct := NVL(emp_record.commission_pct, 0);
total_wages := total_wages + emp_record.salary
+ emp_record.commission_pct;
DBMS_OUTPUT.PUT_LINE('Loop number = ' || counter ||
'; Wages = '|| TO_CHAR(total_wages)); /* Debug line */
counter := counter + 1; /* Increment debug counter */
END LOOP;
/* Debug line */
DBMS_OUTPUT.PUT_LINE('Total wages = ' ||
TO_CHAR(total_wages));
RETURN total_wages;
END;
ユーザーがttIsqlで次の文を実行するとします。
Command> SET SERVEROUTPUT ON Command> VARIABLE salary NUMBER; Command> EXECUTE :salary := dept_salary(20);
次のような出力が表示されます。
Loop number = 1; Wages = 13000 Loop number = 2; Wages = 19000 Total wages = 19000 PL/SQL procedure successfully executed.
DBMS_OUTPUTパッケージでは、GET_LINESプロシージャで使用するために、2つの表タイプが宣言されます。
|
ノート:
|
このパッケージは、GET_LINESプロシージャとともに使用され、PUTプロシージャおよびPUT_LINEプロシージャを介して送信されたテキストを取得します。
表4-2 DBMS_OUTPUTパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
メッセージの出力を無効にします。 |
|
|
メッセージの出力を有効にします。 |
|
|
バッファから1行を取り出します。 |
|
|
バッファから行の配列を取り出します。 |
|
|
|
|
|
行の一部をバッファに格納します。 |
|
|
バッファに1行を格納します。 |
このプロシージャは、PUT、PUT_LINE、NEW_LINE、GET_LINEおよびGET_LINESへのコールを無効にし、バッファに残っている情報をパージします。
ENABLEプロシージャと同様に、ttIsqlのSET SERVEROUTPUT ON設定を使用している場合は、このプロシージャをコールする必要はありません。
このプロシージャは、PUT、PUT_LINE、NEW_LINE、GET_LINEおよびGET_LINESへのコールを有効にします。DBMS_OUTPUTパッケージが有効化されていない場合、これらのプロシージャへのコールは無視されます。
使用上のノート
ttIsqlからSET SERVEROUTPUT ONを使用する場合、このプロシージャをコールする必要はありません。これは自動的にコールされます(現在のリリースでは、buffer_sizeにNULL値が設定されています)。
ENABLEへのコールが複数ある場合、buffer_sizeは最後に指定された値になります。ユーザーがbuffer_size(NOT NULL)を指定した場合、最大サイズは1,000,000および最小サイズは2000です。
通常、NULLを選択することをお薦めします。デフォルトは、無制限のバッファをサポートしていなかった以前のデータベース・バージョンとの下位互換のために20000です。
このプロシージャは、バッファに入れられた単一行の情報を取り出します。
使用上のノート
単一行または行の配列をバッファから取り出すことができます。バッファに入れられた単一行の情報を取り出すには、GET_LINEをコールします。サーバーへのコール数を減らすには、GET_LINESをコールして、バッファから行の配列を取り出します。
ttIsqlを使用している場合、特別なSET SERVEROUTPUT ONコマンドを使用することで、この情報を自動的に表示するように選択できます。
GET_LINEまたはGET_LINESをコールしてから、次にPUT、PUT_LINEまたはNEW_LINEをコールする前に取り出されなかった行は、次のメッセージとの混同を避けるために破棄されます。
このプロシージャは、バッファから行の配列を取り出します。
構文
DBMS_OUTPUT.GET_LINES ( lines OUT DBMS_OUTPUT.CHARARR, numlines IN OUT INTEGER); DBMS_OUTPUT.GET_LINES ( lines OUT DBMS_OUTPUT.DBMSOUTPUT_LINESARRAY, numlines IN OUT INTEGER);
使用上のノート
単一行または行の配列をバッファから取り出すことができます。バッファに入れられた単一行の情報を取り出すには、GET_LINEをコールします。サーバーへのトリップ数を減らすために、バッファから行の配列を取り出すには、GET_LINESをコールします。
ttIsqlを使用している場合、特別なSET SERVEROUTPUT ONコマンドを使用することで、この情報を自動的に表示するように選択できます。
GET_LINEまたはGET_LINESをコールしてから、次にPUT、PUT_LINEまたはNEW_LINEをコールする前に取り出されなかった行は、次のメッセージとの混同を避けるために廃棄されます。
このプロシージャは、行端マーカーを設定します。GET_LINEプロシージャおよびGET_LINESプロシージャは、改行で区切られた行を戻します。PUT_LINEプロシージャまたはNEW_LINEへのすべてのコールによって、GET_LINEまたはGET_LINESで戻される行が生成されます。
このプロシージャは、行の一部をバッファに設定します。
|
ノート: NUMBER入力を使用するPUTバージョンは非推奨になりました。これは、下位互換性を保つためにのみサポートされています。 |
使用上のノート
PUTを複数回コールすることによって個別に情報行を作成するか、PUT_LINEをコールして情報行全体をバッファに設定できます。
PUT_LINEをコールすると、指定した項目には行端マーカーが自動的に付きます。PUTをコールして行を作成する場合、NEW_LINEをコールして、独自の行端マーカーを追加する必要があります。GET_LINEおよびGET_LINESは、改行文字で終了していない行は戻しません。
行が行制限を超えた場合は、エラー・メッセージを受信します。
PUTまたはPUT_LINEで作成した出力はバッファに入れられます。この出力は、それをバッファに入れたPL/SQLプログラム・ユニットがコール元に戻るまで取り出せません。
例外
表4-7 PUTプロシージャの例外
| 例外 | 説明 |
|---|---|
|
|
ENABLEプロシージャ・コールに指定した |
|
|
行の長さのオーバーフロー(各行の制限は32767バイト) |
このプロシージャは、行をバッファに設定します。
|
ノート: NUMBER入力を使用するPUT_LINEバージョンは非推奨になりました。これは、下位互換性を保つためにのみサポートされています。 |
使用上のノート
PUTを複数回コールすることによって個別に情報行を作成するか、PUT_LINEをコールして情報行全体をバッファに設定できます。
PUT_LINEをコールすると、指定した項目には行端マーカーが自動的に付きます。PUTをコールして行を作成する場合、NEW_LINEをコールして、独自の行端マーカーを追加する必要があります。GET_LINEおよびGET_LINESは、改行文字で終了していない行は戻しません。
行が行制限を超えた場合は、エラー・メッセージを受信します。
PUTまたはPUT_LINEで作成した出力はバッファに入れられます。この出力は、それをバッファに入れたPL/SQLプログラム・ユニットがコール元に戻るまで取り出せません。
例外
表4-9 PUT_LINEプロシージャの例外
| 例外 | 説明 |
|---|---|
|
|
ENABLEプロシージャ・コールに指定した |
|
|
行の長さのオーバーフロー(各行の制限は32767バイト) |