41

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

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

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

4

4 に答える 4

78
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE
于 2009-01-13T18:22:36.770 に答える
27

理由があると思いますが、念のため...代わりに「マージ」クエリの使用を検討する必要があります。

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 ブロックに変更しました。明らかに、手順とは独立して実行することもできます)。

于 2009-01-13T18:31:41.963 に答える
14

あなたが探している条件は DUP_VAL_ON_INDEX

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')
于 2009-01-13T18:22:34.370 に答える