web-dev-qa-db-fra.com

Comment intercepter une erreur de contrainte unique dans un bloc PL / SQL?

Disons que j'ai un bloc Oracle PL/SQL qui insère un enregistrement dans une table et que je dois récupérer d'une erreur de contrainte unique, comme ceci:

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

Est-il possible de remplacer les points de suspension pour quelque chose afin d'attraper une erreur de contrainte unique?

37
Thiago Arrais
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE
66
Ricardo Villamil

Je suis sûr que vous avez vos raisons, mais juste au cas où ... vous devriez également envisager d'utiliser une requête de "fusion" à la place:

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;

(modifié ce qui précède pour être dans le bloc de début/fin; vous pouvez évidemment l'exécuter indépendamment de la procédure).

26
William

Je soupçonne que la condition que vous recherchez est 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