2010-02-25 6 views
7

j'ai cet exemple simple je ne peux pas semble obtenir le fonctionnement:Oracle MERGE ne pas insérer

MERGE INTO mytable mt 
USING dual 
ON (mt.id = 'AAA') 
WHEN MATCHED THEN 
    UPDATE SET mt.name = 'updated' 
WHEN NOT MATCHED THEN 
    INSERT (mt.id , mt.name) 
    VALUES ('AAA', 'Gooood'); 

Si un enregistrement « AAA » existe dans le tableau, il est mis à jour avec succès.

Mais si n'existe pas, il est pas inséré:

Affected rows: 0 
Time: 0.003ms 

Toute idée sur ce que je fais mal?

+0

Quel outil utilisez-vous "qui répond: 0 lignes affectées Temps: 0.003ms"? –

+0

On se demande si l'OP fusionne sans commit dans une session et demande à partir d'un autre. Ou si l'application existante interprète correctement la sortie de l'analogue de SQL% ROWCOUNT. –

+0

Est-il possible que votre table 'mytable' nécessite plus que simplement' id' et 'name' pour faire une insertion valide? –

Répondre

8

Works pour moi:

SQL> create table mytable (id varchar(3), name varchar(30)); 

Table created. 

SQL> MERGE INTO mytable mt 
    2 USING dual 
    3 ON (mt.id = 'AAA') 
    4 WHEN MATCHED THEN 
    5  UPDATE SET mt.name = 'updated' 
    6 WHEN NOT MATCHED THEN 
    7  INSERT (mt.id , mt.name) 
    8  VALUES ('AAA', 'Gooood'); 

1 row merged. 

SQL> select * from mytable; 

ID NAME 
--- ------------------------------ 
AAA Gooood 
+0

Moi aussi sur 10.2.0.4. – DCookie

+0

J'utilise Oracle 9.2 ... J'ai entendu la fonction MERGE est "mieux" sur Oracle 10: - / – Jalil