Как отловить уникальную ошибку ограничения в блоке PL / SQL? - PullRequest
36 голосов
/ 13 января 2009

Скажем, у меня есть блок Oracle PL / SQL, который вставляет запись в таблицу, и мне нужно восстановиться после уникальной ошибки ограничения, например:

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

Можно ли заменить многоточие на что-то, чтобы поймать уникальную ошибку ограничения?

Ответы [ 3 ]

65 голосов
/ 13 января 2009
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE
26 голосов
/ 13 января 2009

Я уверен, что у вас есть свои причины, но на всякий случай ... вам также следует рассмотреть возможность использования запроса "слияния":

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;

(изменил вышеперечисленное в блоке начала / конца; очевидно, вы можете запускать его независимо от процедуры).

12 голосов
/ 13 января 2009

Я подозреваю, что вы ищете состояние DUP_VAL_ON_INDEX

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...