質問
Oracleで、単純なデータテーブルが指定された場合:
create table data (
id VARCHAR2(255),
key VARCHAR2(255),
value VARCHAR2(511));
「挿入または更新」したい場合価値。次のようなものがあります:
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');
これよりも良い方法はありますか?このコマンドには次の欠点があるようです:
- すべてのリテラルを2回入力する必要があります(またはパラメーター設定で2回追加する)
- 「デュアル使用」構文はハックのようです
これが最良の方法である場合、JDBCで各パラメーターを2回設定する方法はありますか?
解決
デュアルの使用をハックとは考えません。バインディング/タイピングを2回取り除くには、次のようにします。
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);
他のヒント
PL / SQL API内でMERGEを非表示にしてから、JDBC経由で呼び出します:
data_pkg.merge_data ('someid', 'testKey', 'someValue');
MERGEの代替として、APIは以下を実行できます。
begin
insert into data (...) values (...);
exception
when dup_val_on_index then
update data
set ...
where ...;
end;
挿入の前に更新を試行して、例外をチェックする必要を省きます。
update data set ...=... where ...=...;
if sql%notfound then
insert into data (...) values (...);
end if;
今でもマージステートメントがありますが、私はまだこの方法で単一行の更新を行う傾向があります-より自然な構文のようです。もちろん、マージは、より大きなデータセットを処理する際に本当に役立ちます。
ストアドプロシージャを使用する
所属していません StackOverflow