sql >> データベース >  >> RDS >> Oracle

OracleのDBMS_OUTPUTパッケージについて学ぶ

    この記事では、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_LINEGET ルーチンは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のテーブルに記録する
    1. SQLServer2014のStandardEditionのお客様にとってのすばらしいニュース

    2. エラー:列が存在しません

    3. Oracleが複数のテーブルから行を削除する

    4. SQL varchar内の特定のサブストリングの出現回数をどのようにカウントしますか?