Vous pouvez essayer ceci
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 syntaxe semble au premier abord un peu intimidante, mais si nous lisons de haut en bas, elle est assez intuitive. Notez les clauses suivantes :
•MERGE (ligne 1) :comme indiqué précédemment, il s'agit désormais de la 4ème instruction DML dans Oracle. Tous les indices que nous pourrions souhaiter ajouter suivent directement ce mot-clé (c'est-à-dire MERGE /*+ HINT */);
•INTO (ligne 2) :c'est ainsi que nous spécifions la cible pour le MERGE. La cible doit être soit un tableau, soit une vue pouvant être mise à jour (une vue en ligne ne peut pas être utilisée ici) ;
•USING (ligne 3) :la clause USING représente le jeu de données source pour le MERGE. Il peut s'agir d'un tableau unique (comme dans notre exemple) ou d'une vue en ligne ;
•ON () (ligne 4) :la clause ON est l'endroit où nous fournissons la jointure entre l'ensemble de données source et la table cible. Notez que les conditions de jointure doivent être entre parenthèses ;
•WHEN MATCHED (ligne 5) :cette clause indique à Oracle ce qu'il faut faire lorsque nous avons déjà un enregistrement correspondant dans la table cible (c'est-à-dire qu'il existe une jointure entre les ensembles de données source et cible). Nous voulons évidemment une mise à jour dans ce cas. L'une des restrictions de cette clause est que nous ne pouvons mettre à jour aucune des colonnes utilisées dans la clause ON (bien que nous n'en ayons bien sûr pas besoin car elles correspondent déjà). Toute tentative d'inclusion d'une colonne de jointure déclenchera une exception d'identifiant invalide non intuitive ; et
•WHEN NOT MATCHED (ligne 10) :cette clause est l'endroit où nous INSÉRONS les enregistrements pour lesquels il n'y a pas de correspondance actuelle.