次のように、テーブルにレコードを挿入するOracle PL/SQLブロックがあり、一意制約エラーから回復する必要があるとします。
begin
insert into some_table ('some', 'values');
exception
when ...
update some_table set value = 'values' where key = 'some';
end;
一意の制約エラーをキャッチするために、省略記号を何かに置き換えることは可能ですか?
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
UPDATE
あなたには理由があると確信していますが、念のため...代わりに「マージ」クエリを使用することも検討してください:
begin
merge into some_table st
using (select 'some' name, 'values' value from dual) v
on (st.name=v.name)
when matched then update set st.value=v.value
when not matched then insert (name, value) values (v.name, v.value);
end;
(begin/endブロックにあるように上記を変更しました。明らかに、プロシージャとは無関係に実行できます)。
あなたが探している状態は DUP_VAL_ON_INDEX
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')