2010-02-25 19 views
7

ho questo semplice esempio non posso sembra ottenere di lavoro:Oracle MERGE non inserisce

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'); 

Se il record di 'AAA' esiste nella tabella, viene aggiornato con successo.

Ma se non esiste, non viene inserita:

Affected rows: 0 
Time: 0.003ms 

Qualsiasi indizio su quello che sto facendo di sbagliato?

+0

Quale strumento stai usando che risponde "righe interessate: 0 Tempo: 0.003ms"? –

+0

Uno si chiede se l'OP si sta unendo senza commit in una sessione e l'interrogazione da un'altra. O se l'app esistente sta interpretando correttamente l'output dall'analogo di SQL% ROWCOUNT. –

+0

E 'possibile che la tabella 'mytable' richieda molto più di' id' e 'name' per fare un inserto valido? –

risposta

8

funziona per me:

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

Anch'io su 10.2.0.4. – DCookie

+0

Uso Oracle 9.2 ... Ho sentito che la funzione MERGE è "migliore" su Oracle 10: - / – Jalil