Oracle-Konstanten in einzelne Tabelle fusionieren
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?
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