Pour votre cas, pas besoin d'utiliser la pièce :
WHEN MATCHED THEN UPDATE ...
( en utilisant WHEN MATCHED THEN UPDATE SET a.id = a.id
est accepté (Oracle ne lance pas) mais n'a aucun impact, donc, une telle utilisation est redondante, car vous ne voulez rien changer pour le cas correspondant. )
Poursuivez avec ce qui suit pour le cas actuel :
SQL> CREATE TABLE domains(
id INT,
name VARCHAR2(50),
code VARCHAR2(50),
description VARCHAR2(50)
);
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
SQL> MERGE INTO domains A USING
(SELECT 2 id, 'Domain A' name, 'D.A.' code, 'This is Domain A' description
FROM domains) b
ON ( a.name = b.name )
WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> SELECT * FROM domains;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D.A. This is Domain A
SQL> DELETE domains;
SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
-- we're deleting and inserting the same row again
SQL> MERGE INTO domains A USING
(SELECT 2 id, 'Domain B' name, 'D.B.' code, 'This is Domain B' description
FROM domains) b
ON ( a.name = b.name )
WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
VALUES( b.id, b.name, b.code, b.description );
SQL> SELECT * FROM domains;
ID NAME CODE DESCRIPTION
-- -------- ----- ----------------
1 Domain A D.A. This is Domain A
2 Domain B D.B. This is Domain B