Du kan prova detta
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 );
Syntaxen ser till en början lite skrämmande ut, men om vi läser igenom uppifrån och ner är den ganska intuitiv. Observera följande satser:
•MERGE (rad 1):som tidigare nämnts är detta nu den fjärde DML-satsen i Oracle. Eventuella tips som vi kanske vill lägga till följer direkt detta nyckelord (dvs. SLUT /*+ HINT */);
•INTO (rad 2):så här anger vi målet för MERGE. Målet måste vara antingen en tabell eller en uppdateringsbar vy (en in-line-vy kan inte användas här);
•USING (rad 3):USING-satsen representerar källdatauppsättningen för MERGE. Detta kan vara en enkel tabell (som i vårt exempel) eller en in-line-vy;
•ON () (rad 4):ON-satsen är där vi tillhandahåller kopplingen mellan källdatauppsättningen och måltabellen. Observera att anslutningsvillkoren måste stå inom parentes;
•NÄR MATCHED (rad 5):den här satsen är där vi instruerar Oracle om vad vi ska göra när vi redan har en matchande post i måltabellen (dvs. det finns en koppling mellan käll- och måldatauppsättningarna). Vi vill uppenbarligen ha en UPPDATERING i det här fallet. En av begränsningarna i denna klausul är att vi inte kan uppdatera någon av kolumnerna som används i ON-satsen (även om vi naturligtvis inte behöver göra det eftersom de redan matchar). Varje försök att inkludera en sammanfogningskolumn kommer att skapa ett ointuitivt ogiltigt identifierareundantag; och
•NÄR INTE MATCHAR (rad 10):den här klausulen är där vi INFOGAR poster för vilka det inte finns någon aktuell matchning.