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

FETCHINTO文でPL/SQL一括収集句を使用する方法

    FETCHINTOステートメントを使用した一括収集句

    前のチュートリアルでは、SELECT-INTOステートメントでPL / SQL Bulk Collectを使用して、複数のコンテキストスイッチを1つに圧縮することができました。 SELECT-INTOステートメントはSQL標準クエリです。つまり、開発者はステートメントの実行をあまり制御できません。

    クエリのパフォーマンスについて話す場合、SELECT-INTOステートメントで範囲を超えることはできません。 SELECT-INTOステートメントのこれらすべての欠点をどのように克服できるか見てみましょう。

    このブログでは、明示カーソルのFETCH-INTOステートメントでBulkCollect句を使用する方法を学習します。 FETCHステートメントはカーソルのライフサイクルの一部であるため、このチュートリアルをよりよく理解するには、明示カーソルの実用的な知識が必要です。同じように、Oracleデータベースで明示カーソルを作成する方法に関するチュートリアルを確認できます。

    FETCHINTOステートメントでBulkCollect句を使用する必要があるのはなぜですか?

    前のブログで述べたように、SELECT-INTOステートメントでBulk-Collectを使用する場合は常に、ランタイムエンジンは暗黙カーソルを使用してタスクを処理します。ただし、FETCH-INTOステートメントでBulk Collectを使用する場合、ランタイムエンジンは明示カーソルを使用してタスクを処理します。

    明示カーソルは、標準のSQLクエリを事前に制御するのに常に役立ちます。たとえば、明示カーソルを使用すると、レコードをフェッチするタイミングや一度に取得するレコードの数を制御できますが、SELECT-INTOステートメントの場合はこれは不可能です。

    Fetch-Intoステートメントを使用した一括収集の構文は何ですか?

    SELECT-INTOステートメントと同様に、bulkcollect句はFETCH-INTOステートメントの属性として機能します。構文は次のとおりです

    FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

    FETCHステートメントは明示カーソルの一部です。親カーソルを宣言せずに実行しようとすると、エラーが発生します。また、一括収集でサポートされている構造はPL/SQLコレクションのみであることを常に忘れないでください。

    例:OracleデータベースでFETCH-INTOステートメントを使用してPL/SQL一括収集を使用する方法。

    SET SERVEROUTPUT ON;
    DECLARE
    --Create an explicit cursor
        CURSOR exp_cur IS
        SELECT first_name FROM employees;
    
        --Declare collection for holding the data 
        TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
        fname   nt_fName;
    BEGIN
        OPEN exp_cur;
        LOOP
            FETCH exp_cur BULK COLLECT INTO fname;
            EXIT WHEN fname.count=0;
            --Print data
            FOR idx IN fname.FIRST.. fname.LAST
            LOOP
                DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) );
            END LOOP; 
        END LOOP;
        CLOSE exp_cur;
    END;
    /
    

    このコード全体のすべての行について、YouTubeチャンネルのビデオチュートリアルで詳しく説明しました。このチュートリアルを見ることができます。

    このコードでは、fetchintoステートメントでBulkCollect句を使用しているため、コンテキストの切り替えが問題にならないことを意味します。バルクコレクト句は、複数のスイッチを1つのスイッチに圧縮するため、パフォーマンスのボトルネックが発生することはありません。

    しかし、それはこのコードが十分に最適化されており、それ以上の最適化を必要としないことを意味しますか?それとも、クエリのパフォーマンスが将来的に問題になることはありませんか?

    これらすべての質問に対する回答を得るとともに、このPL/SQLプログラムをさらに最適化する方法を学ぶためにご期待ください。

    このブログを楽しんでいただけたでしょうか。疑問や質問がある場合、または私がこのブログで何かを言及するのを忘れたと思う場合は、私のFacebookページまたはTwitterで私に書いてください。ありがとう、そして素晴らしい一日を!


    1. ActiveRecord ::StatementInvalid:PG InFailedSqlTransaction

    2. 挿入更新トリガー挿入または更新かどうかを判断する方法

    3. MySQLのバックアップと復元を行うための最速の方法

    4. SQL ServerでOBJECTPROPERTY()を使用して、オブジェクトがストアドプロシージャであるかどうかを確認します