Stai utilizzando insert into ... select from
costruire. Quindi potenzialmente la tua istruzione inserirà più di una riga, il che significa che la tua clausola RETURNING restituirà più di una riga. Di conseguenza è necessario utilizzare la sintassi BULK COLLECT per popolare una raccolta di nuove chiavi.
Quindi proviamo qualcosa del genere ...
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;
/
... solo per ottenere:
Beh, fa schifo.
Sfortunatamente, mentre RETURNING BULK COLLECT INTO funziona con gli aggiornamenti e le eliminazioni, non funziona con gli inserti (o le unioni arrivano a questo). Sono sicuro che ci sono ragioni molto valide nell'architettura interna del kernel Oracle, ma questo dovrebbe funzionare e che non lo sia è molto fastidioso.
Ad ogni modo, come ha sottolineato @PonderStibbons, esiste una soluzione alternativa:il costrutto 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;
/
Ecco una demo di LiveSQL (è richiesto l'accesso OTN gratuito) .