Frage

In Oracle, da eine einfache Datentabelle:

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

nehme ich will „einfügen oder aktualisieren“ Wert. Ich habe so 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 Bedürfnisse zweimal eingegeben werden (oder zweimal über Parametereinstellung hinzugefügt)
  • Die "mit Dual" Syntax scheint hacky

Wenn dies der beste Weg ist, gibt es eine Möglichkeit, um die einzelnen Parameter zweimal in JDBC einstellen zu müssen?

War es hilfreich?

Lösung

Ich glaube nicht, mit Dual ein Hack zu sein. Um loszuwerden Bindung / Eingabe zweimal, ich möchte etwas tun:

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

Andere Tipps

würde ich 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, die API tun kann:

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

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

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

if sql%notfound then

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

end if;

Auch jetzt haben wir die Merge-Anweisung, neige ich dazu noch einzeiligen Aktualisierungen auf diese Weise zu tun - nur mehr scheint eine natürlichere Syntax. Natürlich fusionieren wirklich seine eigene kommt, wenn mit größeren Datensätzen handelt.

Verwenden Sie eine gespeicherte Prozedur

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top