この記事では、DBMS_OUTPUT
について説明します。 ある程度詳細にパッケージ化します。 DBMS_OUTPUT
Oracleのパッケージは、他のDBMSパッケージと同様に、OracleユーザーSYS
が所有しています。 。
DBMS_OUTPUT
を作成するスクリプト パッケージに対するEXECUTE権限をPUBLICに付与し、そのパブリックシノニムを作成します。これは、すべてのOracleユーザーがDBMS_OUTPUT
のルーチンを呼び出すことができることを意味します。 パッケージ名の前にSYS
を付ける必要はありません 。
OracleでDBMS_OUTPUTはどのように機能しますか?
2つの基本的な操作、GET
およびPUT
、パッケージ内のプロシージャを介して実装されます。 PUT
操作は引数を取り、それをストレージ用の内部バッファーに配置します。
GET
操作はこのバッファーから読み取り、その内容を引数としてプロシージャーに返します。 ENABLE
もあります バッファのサイズを設定するプロシージャ。
DBMS_OUTPUTパッケージの手順
PUT
パッケージ内のルーチンはPUT
です 、PUT_LINE
、およびNEW_LINE
。 GET
ルーチンはGET_LINE
およびGET_LINES
。バッファのENABLEおよびDISABLE制御。
PUTおよびPUT_LINEPUTおよびPUT_LINE呼び出しの構文は次のとおりです。
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
ここで、aはバッファーに配置される引数です。パラメータのタイプがこれらのプロシージャをオーバーロードすることに注意してください。 PUT
の3つの異なるバージョンのため およびPUT_LINE
、バッファにはタイプVARCHAR2
の値を含めることができます 、NUMBER
、およびDATE
元の形式でバッファに保存されます。ただし、GET_LINE
およびGET_LINES
バッファから取得し、文字列のみを返します。
GET
の場合 操作が実行されると、バッファの内容はデフォルトのデータ型変換規則に従って文字列に変換されます。変換の形式を指定する場合は、明示的なTO_CHAR
を使用してください PUT
を呼び出す 、GET
ではなく 。
バッファは行に編成され、各行は最大255バイトを持つことができます。 PUT_LINE
引数の後に改行文字を追加して、行の終わりを示します。 PUT
ではない。 PUT_LINE
PUT
を呼び出すのと同じです 次に、NEW_LINE
を呼び出します 。
NEW_LINENEW_LINE呼び出しの構文は次のとおりです。
PROCEDURE NEW_LINE;
NEW_LINE
改行文字をバッファに入れ、行の終わりを通知します。バッファ内の行数に制限はありません。ただし、バッファの合計サイズは、ENABLEで指定された値に制限されます。
GET_LINEGET_LINEの構文は次のとおりです。
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
この行は、バッファの1行を含む文字列であり、ステータスは、その行が正常に取得されたかどうかを示します。 1行の最大長は255バイトです。行が取得された場合、ステータスは0になります。バッファにこれ以上行がない場合は、1になります。
注
バッファラインの最大サイズは255バイトですが、出力変数ラインは255文字を超える場合があります。バッファラインは
DATE
で構成できます たとえば、値。これらはバッファ内で7バイトのストレージを使用しますが、通常は長さが7より大きい文字列に変換されます。
GET_LINES
GET_LINESプロシージャには、PL/SQL表である引数があります。テーブルの種類と構文は次のとおりです
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
linesがPL/SQL表の場合、バッファからの複数の行とnumlines
が含まれます。 要求された行数を示します。 GET_LINESへの入力時に、numlines
要求された行数を指定します。出力では、numlinesには、返される実際の行数が含まれます。これは、要求された数以下になります。 GET_LINESは、GET_LINESへの複数の呼び出しを置き換えるように設計されています。
CHARARR
タイプはDBMS_OUTPUT
でも定義されています パッケージ。したがって、GET_LINES
を呼び出したい場合 コードで明示的に、タイプDBMS_OUTPUT
の変数を宣言する必要があります 。 CHARARR
。例:
Create Table temp_table (char_col varchar2(4000)) / DECLARE /* Demonstrates using PUT_LINE and GET_LINE. */ v_Data DBMS_OUTPUT.CHARARR; v_NumLines NUMBER; BEGIN -- Enable the buffer first. DBMS_OUTPUT.ENABLE(1000000); -- Put some data in the buffer first, so GET_LINES will -- retrieve something. DBMS_OUTPUT.PUT_LINE( 'Line' ); DBMS_OUTPUT.PUT_LINE( 'Line Two' ); DBMS_OUTPUT.PUT_LINE( 'Line Three' ); --Set the maximum number of lines that we want to retrieve. v_NumLines := 3 ; /* Get the contents of the buffer back. Note that v_DATA is declared of type DBMS_OUTPUT. CHARARR, so that it matches the declaration of DBMS_OUTPUT. GET_LINES. */ DBMS_OUTPUT.GET_LINES(v_DATA, v_NumLines); /* Loop through the returned buffer, and insert the contents into tem_table. */ For v_Counter IN 1.. v_NumLines Loop INSERT INTO temp_table ( char_col ) VALUES ( v_Data ( v_Counter )); END LOOP; END; /
有効および無効
ENABLEおよびDISABLE呼び出しの構文は次のとおりです。
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
ここで、buffer_sizeは、内部バッファーの初期サイズ(バイト単位)です。デフォルトのサイズは20,000バイトで、最大サイズは1,000,000バイトです。
後で、PUT
への引数 またはPUT_LINE
このバッファに配置されます。それらは内部形式で格納され、構造が指示するのと同じだけバッファ内のスペースを占有します。
DISABLE
の場合 と呼ばれる場合、バッファの内容はその構造によって決まります。 DISABLE
の場合 が呼び出されると、バッファの内容が削除され、その後のPUT
の呼び出しが行われます。 およびPUT_LINE
影響しません。
DBMS_OUTPUTの使用
DBMS_OUTPUT
パッケージ自体には、印刷のメカニズムは含まれていません。基本的に、先入れ先出しのデータ構造を実装するだけです。
そうは言っても、DBMS_OUTPUT
をどのように使用できますか 印刷用? SQL * Plus、SQL * DBA、およびManagerには、SERVEROUTPUT
と呼ばれるオプションがあります。 。さらに、一部のサードパーティ製品(SQL-Stationを含む)には、DBMS_OUTPUT
の表示を可能にするオプションがあります。 データ。
このオプションを使用すると、SQL*Plusは自動的にDBMS_OUTPUT.GET_LINES
を呼び出します。 PL / SQLブロックが終了し、結果があれば画面に出力するとき。
SQL*PlusコマンドSET SERVEROUTPUT ON
暗黙的に呼び出します。これにより、内部バッファが設定されます。オプションで、SET SERVEROUTPUT ON SIZE
を使用してサイズを指定できます buffer_size ここで、 beffer_size バッファの初期サイズとして使用されます(DBMS_OUTPUT.ENABLE
への引数 。
SERVEROUTPUT on
の場合 、SQL*PlusはDBMS_OUTPUT.GET_LINES
を呼び出します 後 PL/SQLブロックが完了しました。これは、ブロックが終了したときに出力が画面にエコーされ、ではないことを意味します。 ブロックの実行中。 DBMS_OUTPUT
の場合、これは通常問題にはなりません。 デバッグに使用されます。
注意
DBMS_OUTPUT
主にデバギングに使用するように設計されています。一般的な報告を目的としたものではありません。クエリからの出力をカスタマイズする必要がある場合は、DBMS_OUTPUT
よりもOracleReportsなどのツールを使用することをお勧めします。 およびSQL*Plus。
SET serveroutput on SIZE 1000000 BEGIN DBMS_OUTPUT.PUT_LINE('Before loop'); FOR v_Counter IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('Inside loop, couter = ' || v_Counter); END LOOP; DBMS_OUPUT.PUT_LINE( 'After loop'); END; /
内部バッファには最大サイズがあります(DBMS_OUTPUT.ENABLE
で指定) )、各行の最大長は255バイトです。その結果、DBMS_OUTPUT.PUT
を呼び出します 、DBMS_OUTPUT.PUT_LINE
、およびDBMS_OUTPUT.NEW_LINE
どちらかを上げることができます
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
または
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
メッセージは、どの制限を超えたかによって異なります。
関連項目:
- Toad forOracleでDBMS_OUTPUTを有効にする方法
- DBMS_OUTPUT.Put_Line出力をDBMS_OUTPUT.Get_Linesを使用してOracleのテーブルに記録する