Je kunt dit proberen
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 );
De syntaxis ziet er in eerste instantie een beetje ontmoedigend uit, maar als we van boven naar beneden lezen, is het vrij intuïtief. Let op de volgende clausules:
•MERGE (regel 1):zoals eerder vermeld, is dit nu de 4e DML-instructie in Oracle. Alle hints die we zouden willen toevoegen, volgen dit trefwoord direct (bijv. MERGE /*+ HINT */);
•INTO (regel 2):zo specificeren we het doel voor de MERGE. Het doel moet een tabel of een bijwerkbare weergave zijn (een in-line weergave kan hier niet worden gebruikt);
•USING (regel 3):de clausule USING vertegenwoordigt de brongegevensset voor de MERGE. Dit kan een enkele tabel zijn (zoals in ons voorbeeld) of een in-line weergave;
•ON () (regel 4):de ON-clausule is waar we de join leveren tussen de brongegevensset en de doeltabel. Merk op dat de deelnamevoorwaarden tussen haakjes moeten staan;
•WHEN MATCHED (regel 5):in deze clausule geven we Oracle instructies over wat te doen als we al een overeenkomend record in de doeltabel hebben (d.w.z. er is een verbinding tussen de bron- en doelgegevenssets). Uiteraard willen we in dit geval een UPDATE. Een van de beperkingen van deze clausule is dat we geen van de kolommen die in de ON-clausule worden gebruikt, kunnen bijwerken (hoewel we dat natuurlijk niet hoeven te doen omdat ze al overeenkomen). Elke poging om een join-kolom op te nemen, leidt tot een niet-intuïtieve uitzondering voor ongeldige ID's; en
•WHEN NOT MATCHED (regel 10):deze clausule is waar we records INVOEGEN waarvoor er geen huidige overeenkomst is.