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

OracleデータベースのINDICES-OFバインド句を含むFORALLステートメント

    バインドされた句のインデックスを含むFORALLステートメントが必要な理由

    密集したコレクションを参照するまでは、Lower&UpperBound句を含むFORALLステートメントがおそらくバルクデータ処理の最も簡単な方法です。スパースコレクションに関しては、Lower&UpperBound句は強力ではありません。また、残念ながら、実際のシナリオでは、密集したコレクションを操作する可能性は、疎なコレクションを操作するよりもはるかに低くなります。

    とにかく、興味があれば、デモンストレーションを行いました。こちらのYouTubeチャンネルの動画で、FORALLステートメントのLower&Upperbound句をスパースコレクションで使用するとどうなるかを確認してください。

    FORALLステートメントのLower&Upper bound句の欠点は、スパースコレクションでは使用できないことです。この欠点は、「インデックス」などのオプションを使用することで簡単に克服できます。 」または「 ’バインドされた句。このチュートリアルはすべて前者のオプションに関するものです。

    INDICES-OFバインド句

    下限と上限の句と同様に、INDICES-OF句は、コレクションを反復処理できるようにすることで、バルクデータ処理に役立ちます。唯一の違いは、INDICES OF句を使用すると、密集したコレクションと疎なコレクションを反復処理できることです。一方、下限と上限の句は、密集したコレクションでのみ機能します。

    バインドされた句のインデックスの構文

    FORALL index IN INDICES OF collection_variable
    [SAVE EXCEPTION]
    DML statements; 
    

    場所:

    FORALL Oracleデータベースの予約済みキーワードの後に​​インデックスが続く このインデックスは、PL/SQLエンジンによって宣言される暗黙的に定義されたループカウンタです。その後、INである別のキーワードを書く必要があります。 INキーワードの後に​​は、INDICESOFであるバインドされた句があります。

    予約フレーズ「INDICESOF」を書き込んだ直後に、データを使用するコレクションのコレクション変数を指定する必要があります。コレクション変数を介してプログラム内のコレクションを参照したことはすでにわかっています。続いて、SAVEEXCEPTIONオプションがあります。これはオプションの選択肢です。次に、DMLステートメントがあります。これは任意のDMLステートメントまたはMERGEステートメントです。

    FORALLで使用しているDMLステートメントまたはMERGEステートメントがコレクションを参照している必要があることを確認してください。また、FORALLステートメントは、一度に1つのDMLまたはMERGEステートメントのみを処理できます。

    バインドされた句のインデックスの例

    ここでは、FORALLステートメントを使用したINDICESOFバインド句のデモンストレーションを示します。ここでは、すでに初期化されたスパースネストされたテーブルからデータをフェッチし、テーブルに格納します。

    前のチュートリアルで学習したように、FORALLステートメントはコレクションからデータを取得してテーブルに格納します。したがって、最初にテーブルを作成します。

    SET SERVEROUTPUT ON;
    CREATE TABLE tut_78(
        mul_tab NUMBER(5)
    );
    

    デモンストレーションを簡単にするために、tut_78という名前の非常に単純なテーブルを作成しました。このテーブルには、NUMBERデータ型のmul_tab列が1つだけあります。

    DECLARE
        TYPE my_nested_table IS TABLE OF number;
        var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90);
        --Another variable for holding total number of record stored into the table 
        tot_rec NUMBER;
    BEGIN
        var_nt.DELETE(3, 6);
        
        FORALL idx IN INDICES OF var_nt
            INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx));
            
        SELECT COUNT (*) INTO tot_rec FROM tut_78;
        DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec);
    END;
    /
    

    上記のコードの詳細な説明は、ビデオチュートリアルにあります。ただし、ここでも簡単に説明しましょう。

    上記のPL/SQLブロックの宣言セクション

    このセクションでは、最初に「 my_nested_table」という名前のネストされたテーブルを作成しました ’。 NUMBERデータ型のデータを保持しています。次に、コレクション変数「 var_nt」を宣言しました ’。これを使用して、コレクションに10個の数値要素を格納することにより、最初の10個のインデックスを初期化しました。

    ネストされたテーブルとそのコレクション変数とは別に、追加の変数「 tot_rec」も宣言しました。 ’の数値データ型。この変数は、テーブルに格納されるデータの総数を保持するために使用されます。

    実行セクション

    実行セクションの最初のステートメントを見ると。コレクションメソッドDELETEを使用して、インデックス3からインデックス6にデータを削除したことがわかります。これは、コレクションのインデックスが順番に入力されていないことを意味します。これにより、コレクションの性質が DENSEから変わります。 SPARSEへ。

    収集メソッドのDELETE呼び出しの直後に、INDICESOFバインド句を含むFORALLステートメントがあります。このステートメントを使用して、コレクション「my_nested_table」をテーブルtut_78に挿入します。

    次に、SELECT-INTOステートメントがあります。このステートメントは、テーブルtut_78に挿入された行の総数を返し、その値を変数tot_recに格納します。次に、DBMS_OUTPUTステートメントを使用して、変数tot_recに格納されている値を、フォーマットされた文字列とともにユーザーに表示します。

    上記のコードの詳細な説明については、YouTubeチャンネルでこのチュートリアルをご覧になることを強くお勧めします。また、チャンネルに登録して、さらに興味深いチュートリアルを入手することを忘れないでください。

    これは、INDICESOFバインド句を含むFORALLステートメントを使用してバルクデータ処理を行う方法に関するPL/SQLチュートリアルです。もしそうなら、あなたが読んで楽しんだことを願っています、そしてあなたのソーシャルメディアでこのブログを共有してください。素晴らしい一日を!


    1. PostgreSQLで文字列を日付に変換する方法

    2. データベーステーブルからのランダムレコード(T-SQL)

    3. OracleでのIPv4/IPv6アドレスの表現

    4. パラメータを使用してOracleで関数を実行する方法