41 votes

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?

78voto

Ricardo Villamil Points 3080
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE

27voto

William Points 511

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; évidemment, vous pouvez également l'exécuter indépendamment de la procédure).

14voto

EvilTeach Points 12235

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!')
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X