Du använder insert into ... select from
konstruera. Så potentiellt kommer ditt uttalande att infoga mer än en rad, vilket innebär att din RETURNING-sats kommer att returnera mer än en rad. Följaktligen måste du använda BULK COLLECT-syntaxen för att fylla i en samling av nya nycklar.
Så vi provar något sånt här ...
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;
/
... bara för att få:
Det suger väl.
Tyvärr, medan RETURNING BULK COLLECT INTO fungerar med uppdateringar och borttagningar, fungerar det inte med infogningar (eller sammanslagningar kommer till det). Jag är säker på att det finns mycket goda skäl i den interna arkitekturen för Oracle-kärnan, men det här borde fungera, och att det inte gör det är mycket irriterande.
Hur som helst, som @PonderStibbons påpekade finns det en lösning:FORALL-konstruktionen.
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;
/
Här är en LiveSQL-demo (gratis OTN-inloggning krävs) .