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

INSERT...SELECTを使用して戻る代わりに

    insert into ... select fromを使用しています 構築します。したがって、ステートメントが複数の行を挿入する可能性があります。つまり、RETURNING句は複数の行を返します。したがって、コレクションにデータを入力するには、BULKCOLLECT構文を使用する必要があります。 新しいキーの。

    だから私たちはこのようなことを試みます...

    declare
        /* NB: define this collection using the appropriate name  */
        type new_keys is table of table_xxx.cola%type;
        col_res new_keys;
    begin
        INSERT INTO TBL_XXX
        SELECT COLA * 10, COLB, COLC FROM TBL_YYY
        RETURNING table_xxx.COLA bulk collect INTO COL_RES;
    end;
    /
    

    ...取得するだけです:

    まあそれは最悪だ。

    残念ながら、RETURNING BULK COLLECT INTOは更新と削除では機能しますが、挿入では機能しません(またはマージが発生します)。 Oracleカーネルの内部アーキテクチャには非常に確かな理由があると確信していますが、これは機能するはずであり、最も煩わしいことではありません。

    とにかく、@ PonterStibbonsが指摘したように、回避策があります:FORALLコンストラクト。

    declare
        type new_rows is table of tbl_xxx%rowtype;
        rec_xxx new_rows;
        type new_keys is table of tbl_xxx.cola%type;
        col_xxx new_keys;
    begin
        select cola * 10, colb, colc 
        bulk collect into rec_xxx
        from tbl_yyy;
    
        forall idx in 1 .. rec_xxx.count()
            insert into tbl_xxx
            values rec_xxx(idx)
            returning tbl_xxx.cola bulk collect into col_xxx
        ;
    
        for idx in 1 .. rec_xxx.count() loop
            dbms_output.put_line('tbl_xxx.cola = ' || col_xxx(idx));
       end loop;
    end;
    /
    

    これが LiveSQLデモ(無料のOTNログインが必要)> 。




    1. mysql、列名を繰り返し処理します

    2. テーブルから重複を削除します

    3. EXECUTEFORMATの使用方法...postgres関数での使用

    4. オブジェクトの永続化中にHibernateが誤ってエンコードする[UTF-8]