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

OracleデータベースでSELECTINTOステートメントを使用して一括収集句を使用する方法

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

    PL / SQL Bulk Collectシリーズの2番目のチュートリアルへようこそ。ここでは、SELECT-INTOステートメントでBULKCOLLECT句を使用する方法を学習します。

    コンテキストスイッチは優れていますが、数が少ない場合に限ります。コンテキストスイッチの数が増えると、クエリのパフォーマンスが低下するなどの問題が発生する可能性があります。コンテキストスイッチによって引き起こされるこのオーバーヘッドは、それらを圧縮できれば簡単に制御できます。これはまさにこのチュートリアルで学ぶことです。

    SELECT-INTOについて詳しく知ることができます ここ

    Select-Intoステートメントで一括収集を使用する必要があるのはいつですか?

    SELECTステートメントの戻り結果が小さいと確信している場合 次に、Select-IntoステートメントでBulkCollect句を使用する必要があります。それ以外の場合、一括収集句を使用すると、Select-Intoステートメントがメモリを大量に消費するモンスターになります。その結果、データベースのパフォーマンスが低下します。

    SELECTステートメントが膨大な数の行を取得している場合はどうすればよいですか?

    一括収集とともにLIMIT句をいつでも使用して、データベースからフェッチされる行数を制限できます。ただし、これは、PL/SQLカーソルでBulkCollect句を使用している場合にのみ可能です。それでも、これについては次のチュートリアルで詳しく説明します。

    SELECT-INTOステートメントで一括収集を使用してフェッチされるデータを制限できないのはなぜですか?

    SELECT-INTOステートメントでBulkCollect句を使用する場合、暗黙的を使用します。 カーソル バルクデータ処理のタスクを実行します。ただし、制限句は、バルク収集句でのみ使用できます。後者が明示カーソルを使用している場合です。 データ処理用。

    一括収集句が暗黙カーソルを使用するのはいつですか、明示カーソルを使用するのはいつですか?

    SELECT-INTOなどのSQLステートメントで一括収集句を使用している場合は、暗黙カーソルを使用します。一方、FETCHステートメントでBulk Collect句を使用する場合は常に、明示的なカーソルを使用します。

    読むことをお勧めします 明示カーソルを作成する方法 FETCHステートメントの詳細をご覧ください。

    一括収集句によって返された結果をプリミティブデータ型の変数に格納できますか?

    いいえ、現時点では、PL / SQLコレクションは、OracleDatabaseの一括収集句を使用した一括データ処理をサポートする唯一のデータ型です。 Bulk Collect句を使用して取得したデータを、Char、Number、Varchar2などのデータ型の変数に格納しようとすると、次のようなエラーが発生します。

    「PLS-00497:INTOリストで単一行と複数行(BULK)を混在させることはできません」

    一括収集の定義
    「BulkCollectInto」ステートメントは、列から複数のデータを選択し、それをSQLコレクションに格納します。

    Select-Intoステートメントを含む一括収集句の構文。

    OracleDatabaseでSelect-Into文とともにPL/SQL一括収集句を使用するための構文は次のとおりです。

    SELECT column_list
     BULK COLLECT INTO collection_datatype_name 
    FROM table_name 
    WHERE <where clause> 
    ORDER BY <column list>;
    

    場所:

    列リスト データを取得する列のリストです。

    コレクションデータ型名 一括収集句によって返されるデータを保持する収集変数の名前になります。

    さらに、データを取得するために指定したすべての列には、そのデータを保持するための対応するコレクションデータ型が含まれている必要があることを常に覚えておいてください。 PL / SQLランタイム・エンジンは、常に列から取得したデータを並行してコレクションに格納するためです。

    SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

    ここで、column_1から取得したデータはcollection_1に保存され、column_2からcollection_2にデータが自動的に保存されます。

    テーブル名 データを取得するテーブルの名前にすることができます。

    続いて、オプションのWHERE句とORDER BY句がありますが、必要に応じてそれらを使用できます。

    構文について説明したので、簡単な例を使用して、OracleDatabaseでSELECTINTOステートメントを使用してPL/SQL一括収集句を操作する方法を学びましょう。

    SET SERVEROUTPUT ON;
    DECLARE
        TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
        TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
        
        fname   nt_fName;
        lName   nt_lName;
    BEGIN
        SELECT first_name, last_name 
            BULK COLLECT INTO fName, lName 
        FROM employees; 
            
            --Print values from the collection--
        FOR idx IN 1..fName.COUNT
        LOOP
            DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
        END LOOP;
    END;
    /
    

    例の説明

    ここに、Select-IntoステートメントでBulkCollect句を使用する方法を示す非常に単純なコードがあります。このコードの宣言セクションでは、最初に2つのネストされたテーブルタイプのコレクション「nt_fName」と「nt_lName」を、対応するコレクション変数「fName」と「lName」とともに作成しました。実際、これらのコレクションは両方とも、Select-Intoステートメントによって返されるデータを保持するために使用されます。

    ネストされたテーブルの作成方法については、こちらをご覧ください。

    宣言セクションには、一括収集句を含むSelect-Intoステートメントがあります。さらに、このSelect-Intoステートメントを使用して、employeesテーブルのFirstName列とLastName列からすべてのデータを取得しています。そして、Bulk Collect句を使用して、そのデータを対応するコレクションに並行して保存しています。

    Select-Intoステートメントに加えて、「Forループ」もあります これは、両方のコレクションのデータを出力画面に印刷しています。

    必見
    Bulk Collect Clauseが複数のコンテキストスイッチを1つに圧縮し、クエリのパフォーマンスを向上させる方法を示したビデオを必ずチェックしてください。ここにリンクがあります。

    これは、Select-Intoステートメントを使用したBulkCollect句の概念を詳細に説明するチュートリアルです。このチュートリアルでは、認定試験と面接で直面する可能性のあるすべての質問に答えてみました。

    あなたが読書を楽しんだことを願っています。あなたのソーシャルであなたの友人とこのブログを共有することを忘れないでください。ありがとう&素晴らしい一日を!


    1. SQLServerをSugarCRMに接続します

    2. MySQLで2つの列を比較する方法

    3. MySQLの複数のテーブルから削除するにはどうすればよいですか?

    4. DBMS_JOBとDBMS_SCHEDULER