2008-10-03 14 views
17

In Oracle, eine einfache Datentabelle gegeben:Oracle fusionieren Konstanten in einzelne Tabelle

create table data (
    id  VARCHAR2(255), 
    key  VARCHAR2(255), 
    value VARCHAR2(511)); 

nehme an, ich will „einfügen oder aktualisieren“ einen Wert. Ich habe etwas wie:

merge into data using dual on 
    (id='someid' and key='testKey') 
when matched then 
    update set value = 'someValue' 
when not matched then 
    insert (id, key, value) values ('someid', 'testKey', 'someValue'); 

Gibt es einen besseren Weg als das? Dieser Befehl scheint die folgenden Nachteile zu haben:

  • Alle wörtlichen Bedarf zweimal eingegeben werden (oder zweimal über Parametereinstellung hinzugefügt)
  • Die „mit Dual“ Syntax Hacky

scheint Wenn dies der beste Weg, muss man jeden Parameter in JDBC zweimal einstellen?

+0

Wenn Sie 10g verwenden, ist "DUAL" noch weniger ein Hack. davor war es ein echter Tisch, in 10g ist es nicht. –

Antwort

18

Ich halte die Verwendung von Dual nicht für einen Hack. Um loszuwerden Bindung/Eingabe zweimal, würde ich so etwas wie:

merge into data 
using (
    select 
     'someid' id, 
     'testKey' key, 
     'someValue' value 
    from 
     dual 
) val on (
    data.id=val.id 
    and data.key=val.key 
) 
when matched then 
    update set data.value = val.value 
when not matched then 
    insert (id, key, value) values (val.id, val.key, val.value); 
-4

Verwenden Sie eine gespeicherte Prozedur

4

Ich würde die MERGE in einem PL/SQL API verstecken und rufen Sie dann, dass über JDBC:

data_pkg.merge_data ('someid', 'testKey', 'someValue'); 

Als Alternative zu fusionieren, könnte der API tun:

begin 
    insert into data (...) values (...); 
exception 
    when dup_val_on_index then 
     update data 
     set ... 
     where ...; 
end; 
2

Ich ziehe das Update vor dem Einsatz versuchen, zu speichern, die eine Ausnahme zu überprüfen.

update data set ...=... where ...=...; 

if sql%notfound then 

    insert into data (...) values (...); 

end if; 

Schon jetzt haben wir die Merge-Anweisung, neige ich dazu noch einzeiligen Aktualisierungen auf diese Weise zu tun - nur scheint eine natürlichere Syntax. Natürlich kommt merge wirklich zur Geltung, wenn es um größere Datenmengen geht.

+1

Ich denke, Sie haben Recht, dass es eine natürlichere Syntax scheint, aber ich bevorzuge den Single-Transaktion-Ansatz der Zusammenführung selbst - keine Chance, etwas Unerwartetes passiert zwischen Update und einfügen. –

+0

Zwischen dem Update und der Einfügung kann nichts Ungewöhnliches passieren - dies ist eine Oracle-konsistente Transaktionsansicht. –

+0

Funktioniert diese Syntax in oracle9i? –

0

Wenn Quell- und Zieltabelle identisch sind, müssen Sie DUAL verwenden.