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;
/
これが