Anda menggunakan insert into ... select from
membangun. Jadi berpotensi pernyataan Anda akan memasukkan lebih dari satu baris, yang berarti klausa RETURNING Anda akan mengembalikan lebih dari satu baris. Akibatnya, Anda perlu menggunakan sintaks BULK COLLECT untuk mengisi koleksi kunci baru.
Jadi kami mencoba sesuatu seperti ini ...
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;
/
... hanya untuk mendapatkan:
Yah itu menyebalkan.
Sayangnya, sementara RETURNING BULK COLLECT INTO berfungsi dengan pembaruan dan penghapusan, itu tidak berfungsi dengan sisipan (atau penggabungan terjadi). Saya yakin ada alasan yang sangat masuk akal dalam arsitektur internal kernel Oracle tetapi ini seharusnya berhasil, dan itu tidak terlalu mengganggu.
Bagaimanapun, seperti yang ditunjukkan oleh @PonderStibbons ada solusi:konstruksi 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;
/
Ini demo LiveSQL (diperlukan login OTN gratis) .