2009-01-13 76 views
32

说我有一个插入一条记录表一个Oracle PL/SQL块,需要从一个独特的约束错误恢复,就像这样:如何捕获PL/SQL块中的唯一约束错误?

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

是否有可能更换的东西省略号以捕获一个唯一的约束错误?

+0

以这种方式使用异常有点慢,因为引发异常需要相当长的时间。尝试合并。 – tuinstoel 2009-01-13 20:33:44

+1

同意。但请记住,这个例子只是许多可能的用例之一。问题的确是“唯一约束错误的标识是什么?”。这就是为什么我投票威廉的答案,但接受里卡多的。 – 2009-01-14 11:34:19

+2

PL/SQL代码中的异常并不像托管或高级语言(C#,Java)那样昂贵。在数据库应用程序中,真正的“缓慢”是由数据库访问引起的,在这种情况下,PL/SQL异常成本是微不足道的。 – 2009-01-16 16:25:49

回答

55
EXCEPTION 
     WHEN DUP_VAL_ON_INDEX 
     THEN 
     UPDATE 
11

我怀疑你正在寻找的条件是DUP_VAL_ON_INDEX

EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!') 
+0

如何写出导致问题的值? – 2014-03-21 16:18:34

24

我敢肯定,你有你的理由,但以防万一......你也应该考虑使用“合并”查询相反:

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; 

(修改上述是在开始/结束块,显然你可以独立运行它的程序)。