La risposta Michaels dà nel thread di cui sopra dovrebbe funzionare bene . Il messaggio di errore che stai ricevendo (ORA-38104: colonne di riferimento nella clausola ON non possono essere aggiornati: foo.id) suggerisce che si sta cercando di fare qualcosa di simile a quanto segue:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.id = bar.id, foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Come afferma errore , le colonne a cui si fa riferimento nella clausola "ON" non possono essere aggiornate. Come tale, il seguente avrebbe funzionato bene:
merge into foo
using (select null from dual)
on (foo.id = bar.id)
when matched then update set foo.another_field = bar.another_field
when not matched then insert VALUES bar;
Se davvero bisogno di aggiornare foo.id, v'è una possibile soluzione qui: How to avoid ORA-3814 error on merge?
Modifica
Una possibile alternativa sarebbe per fare quanto segue:
update foo set row = bar where foo.id = bar.id;
if sql%rowcount = 0 then
insert into foo values bar;
end if;
Questo dovrebbe essenzialmente equivale a fare la stessa cosa della fusione s ICHIARAZIONE.
credere che questo è stato risposto sul forum di oracolo qui https://community.oracle.com/thread/621511?start=0&tstart=0 guarda la risposta di Solomon. C'è anche una fusione di FORALL che potrebbe funzionare per te. http://www.morganslibrary.org/reference/plsql/array_processing.html –
Grazie per la risposta. La risposta di Solomons sta enumerando tutti i campi del rowtype, che in un certo senso rimuove l'intero punto di utilizzo di un rowtype. Non sono sicuro di capire come un "FORALL MERGE" sarebbe di aiuto qui. La soluzione di MichaelS sembra comunque promettente. – Anders
No, non posso neanche rispondere a MichaelS. Ho appena ottenuto 'ORA-38104: Le colonne a cui si fa riferimento nella clausola ON non possono essere aggiornate: foo.id' – Anders