2015-11-16 21 views
6

Con una variabile di tipo barfoo%ROWTYPE posso fare entrambe le cose e INSERTUPDATE in PL/SQL:MERGE usando una variabile rowtype in PL/SQL su Oracle?

INSERT INTO foo VALUES bar; 
UPDATE foo SET ROW = bar WHERE id = bar.id; 

Ma come faccio a fare un MERGE? Il seguente approccio genera il seguente messaggio di errore:

MERGE INTO foo USING bar ON foo.id = bar.id 
WHEN MATCHED THEN UPDATE SET ROW = bar 
WHEN NOT MATCHED THEN INSERT VALUES bar; 

PL/SQL: ORA-00942: tabella o vista non esiste

+1

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 –

+0

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

+0

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

risposta

2

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.

+0

A meno che tu non abbia davvero bisogno di usare una dichiarazione di fusione per qualche ragione, ho aggiunto una possibile soluzione alternativa per te. Come affermato da Solomon Yakobson (https://community.oracle.com/thread/621511?start=0&tstart=0) non è possibile utilizzare un rowtype nella clausola when-matched di un'istruzione di fusione – Chrisrs2292

Problemi correlati