Je gebruikt de insert into ... select from
bouwen. Dus mogelijk zal uw instructie meer dan één rij invoegen, wat betekent dat uw RETURNING-clausule meer dan één rij zal retourneren. Daarom moet u de BULK COLLECT-syntaxis gebruiken om een verzameling te vullen van nieuwe sleutels.
Dus we proberen zoiets als dit ...
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;
/
... alleen om te krijgen:
Nou dat is balen.
Helaas, terwijl RETURNING BULK COLLECT INTO werkt met updates en verwijderingen, werkt het niet met invoegingen (of daar komen samenvoegingen bij). Ik weet zeker dat er heel goede redenen zijn in de interne architectuur van de Oracle-kernel, maar dit zou moeten werken, en dat is het meest irritante.
Hoe dan ook, zoals @PonderStibbons aangaf, is er een oplossing:de FORALL-constructie.
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;
/
Hier is een LiveSQL-demo (gratis OTN-aanmelding vereist) .