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?
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
UPDATE
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).
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!')