Puoi provare questo
1 MERGE
2 INTO target_table tgt
3 USING source_table src
4 ON ( src.object_id = tgt.object_id )
5 WHEN MATCHED
6 THEN
7 UPDATE
8 SET tgt.object_name = src.object_name
9 , tgt.object_type = src.object_type
10 WHEN NOT MATCHED
11 THEN
12 INSERT ( tgt.object_id
13 , tgt.object_name
14 , tgt.object_type )
15 VALUES ( src.object_id
16 , src.object_name
17 , src.object_type );
La sintassi all'inizio sembra un po' scoraggiante, ma se leggiamo dall'alto verso il basso, è abbastanza intuitiva. Nota le seguenti clausole:
•MERGE (riga 1):come affermato in precedenza, questa è ora la 4a istruzione DML in Oracle. Eventuali suggerimenti che potremmo voler aggiungere seguono direttamente questa parola chiave (es. MERGE /*+ HINT */);
•INTO (riga 2):ecco come specifichiamo il target per il MERGE. La destinazione deve essere una tabella o una vista aggiornabile (qui non è possibile utilizzare una vista in linea);
•USING (riga 3):la clausola USING rappresenta il dataset di origine per MERGE. Può essere una singola tabella (come nel nostro esempio) o una vista in linea;
•ON () (riga 4):la clausola ON è dove forniamo il join tra il dataset di origine e la tabella di destinazione. Tieni presente che le condizioni di unione devono essere tra parentesi;
•WHEN MATCHED (riga 5):questa clausola è dove istruiamo Oracle su cosa fare quando abbiamo già un record corrispondente nella tabella di destinazione (cioè c'è un join tra i dataset di origine e di destinazione). Ovviamente vogliamo un AGGIORNAMENTO in questo caso. Una delle restrizioni di questa clausola è che non possiamo aggiornare nessuna delle colonne utilizzate nella clausola ON (anche se ovviamente non è necessario poiché corrispondono già). Qualsiasi tentativo di includere una colonna di join solleverà un'eccezione non intuitiva di identificatore non valido; e
•WHEN NOT MATCHED (riga 10):questa clausola è dove INSERT record per i quali non esiste una corrispondenza corrente.