Używasz insert into ... select from
zbudować. Więc potencjalnie twoja instrukcja wstawi więcej niż jeden wiersz, co oznacza, że twoja klauzula RETURNING zwróci więcej niż jeden wiersz. W związku z tym musisz użyć składni BULK COLLECT do wypełnienia kolekcji nowych kluczy.
Więc próbujemy czegoś takiego ...
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;
/
... tylko po to, aby:
Cóż, to jest do bani.
Niestety, podczas gdy RETURNING BULK COLLECT INTO działa z aktualizacjami i usuwaniem, nie działa z wstawkami (lub do tego dochodzi scalanie). Jestem pewien, że istnieją bardzo dobre powody w wewnętrznej architekturze jądra Oracle, ale to powinno działać i że nie jest to najbardziej irytujące.
W każdym razie, jak zauważył @PonderStibbons, istnieje obejście:konstrukcja 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;
/
Oto demo LiveSQL (wymagane bezpłatne logowanie OTN) .