この記事では、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のテーブルに記録する