2009-01-13 9 views
32

Bir tabloya kayıt ekleyen ve bu gibi benzersiz bir kısıtlama hatasıyla kurtarmanız gereken bir Oracle PL/SQL bloğum var mı:PL/SQL bloğunda benzersiz bir kısıtlama hatası nasıl yakalanır?

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

Yakalamak için bir şey için elipsin değiştirilmesi mümkün mü benzersiz bir kısıtlama hatası mı?

+0

İstisnaları kullanmak için bu durum biraz yavaşlar, çünkü istisnaları kaldırmak oldukça fazla zaman alır. Birleştirmeyi dene. – tuinstoel

+1

Anlaşıldı. Ancak, bu örneğin birçok olası kullanım örneğinden sadece biri olduğunu unutmayın. Soru gerçekten "benzersiz kısıtlama hatası için id nedir?" Bu yüzden William'ın cevabını seçtim ama Ricardo'yu kabul ettim. –

+2

PL/SQL kodundaki istisnalar, yönetilen veya üst düzey dillerdeki (C#, Java) kadar pahalı değildir. Bir DB uygulamasında gerçek "yavaşlık" db erişiminden kaynaklanır, bu bağlamda PL/SQL istisnası maliyeti önemsizdir –

cevap

55
EXCEPTION 
     WHEN DUP_VAL_ON_INDEX 
     THEN 
     UPDATE 
+2

Soruna neden olan değeri nasıl yazabilirsiniz? –

+0

Lütfen bunu kontrol edin .. http://www.orafaq.com/forum/t/13889/2/ –

11

ben aradığınız koşulu 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

Soruna neden olan değeri nasıl yazabilirsiniz? Özel durum yakalandığında –

+0

, kopyaları seçip raporlayan yeni bir sorgu çalıştırın. – EvilTeach

+0

Sorguyu çalıştırmadan önce bunu yapabilirsiniz? –

24

ben size nedenleri var eminim ama her ihtimale karşı ... ayrıca bir "birleştirme" kullanmayı düşünmelisiniz sorgu şüpheli Bunun yerine:

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; 

(/ son başlamak blokta olduğu yukarıda modifiye edilmiş, belli an independantly prosedürün o çalışabilir).

+1

Bu özel kullanım durumu ile yardımcı olur, ancak bu sadece bir örnektir. Asıl soru, benzersiz bir kısıtlama hatasıyla ilgili id ​​iddiasıdır, bu yüzden bu cevabı geri çeviriyorum çünkü gerçekten yararlıdır, ama Ricardo kabul edilen kişi olacaktır. –

+1

Ricardo'nun cevabı doğru adlandırılmış istisna idi, ancak William'ın önerisinin uzun vadede daha fazla insana yardım edeceğini düşünüyorum. –