web-dev-qa-db-ja.com

PL / SQLブロックで一意制約エラーをキャッチする方法は?

次のように、テーブルにレコードを挿入するOracle PL/SQLブロックがあり、一意制約エラーから回復する必要があるとします。

begin
    insert into some_table ('some', 'values');
exception
    when ...
        update some_table set value = 'values' where key = 'some';
end;

一意の制約エラーをキャッチするために、省略記号を何かに置き換えることは可能ですか?

37
Thiago Arrais
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE
66

あなたには理由があると確信していますが、念のため...代わりに「マージ」クエリを使用することも検討してください:

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ブロックにあるように上記を変更しました。明らかに、プロシージャとは無関係に実行できます)。

26
William

あなたが探している状態は DUP_VAL_ON_INDEX

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')
12
EvilTeach