Používáte insert into ... select from
postavit. Váš příkaz tedy potenciálně vloží více než jeden řádek, což znamená, že vaše klauzule RETURNING vrátí více než jeden řádek. V důsledku toho musíte použít syntaxi BULK COLLECT k naplnění kolekce nových klíčů.
Takže zkusíme něco takového ...
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;
/
... pouze získat:
No to je na hovno.
Bohužel, zatímco RETURNING BULK COLLECT DO pracuje s aktualizacemi a mazáním, nefunguje s vkládáním (nebo k tomu dochází sloučením). Jsem si jistý, že v interní architektuře jádra Oracle existují velmi rozumné důvody, ale toto by mělo fungovat, a že ne, je velmi nepříjemné.
Každopádně, jak poznamenal @PonderStibbons, existuje řešení:konstrukce 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;
/
Zde je ukážka LiveSQL (vyžaduje bezplatné přihlášení OTN) .