2009-01-13 58 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; 

(修改上述是在開始/結束塊,顯然你可以獨立運行它的程序)。