2011-08-28 20 views
7

SQL geliştirici kullanıyorum ve tablolarımdan birine bir kısıtlama ekledim. Bir kısıtlama ihlali yakalamak için psql

constraint valid_gender check(gender in ('M','F','I','T')) 

Bir plsql prosedürü kullanarak cinsiyet 'x' sözü söyleyen bir girdi eklemeye çalıştığınızda

, bu (olması gerektiği gibi) kısıtlama ihlali ile başarısız olur.

plsql prosedürüne "Catch" eklemek istiyorum, böylece eğer valid_gender voilated olursa ona özel raise_application_error olabilir. Mümkün mü? Oracle diyor istisna yükseltecektir

cevap

8

:

ORA-02290: kısıtlamasını kontrol edin (yourschema.valid_gender) Bir özel durum işleyici olduğunu yakalamak ve yerine kendi özel durum yükseltebilirsiniz

ihlal raise_application_error'u birkaç şekilde kullanma.

1) özellikle tuzak ORA-02290 böyle istisna olabilir:

declare 
    e_check_violated exception 
    pragma exception_init (e_check_violated, -2290); 
begin 
    insert ... 
exception 
    when e_check_violated then 
    if sqlerrm like '%(yourschema.valid_gender)%' then 
     raise_application_error(-20001,'Invalid gender'); 
    else 
     raise; 
    end if; 
end; 

2) Şunları yapabilirsiniz tuzak tüm istisnalar ve bunları denetlemek:

begin 
    insert ... 
exception 
    when others then 
    if sqlerrm like 'ORA-02290:%(yourschema.valid_gender)%' then 
     raise_application_error(-20001,'Invalid gender'); 
    else 
     raise; 
    end if; 
end; 

büyük uygulamasında oldukça olduğunu Bunu genelleştirmek için bir istisna işleme prosedürüne sahip olmak ve bir tablodaki kısıtlamaya özel mesajı aramak yaygındır.

+0

teşekkür çok – luke

+0

ben –

+0

:) olabilir 2 ediyorum ya 3 ise Bu daha uygun bir cevap, teşekkür ederim – chulian

0

Sadece ilk önce test edebilir:

if gender_value not in ('M','F','I','T') then 
    raise_application_error... 
end if; 
0

kullanım Anonim bloğu kodunuzda ...

BEGIN 
    INSERT or update... 

    EXCEPTION 
    WHEN dup_val_on_index THEN 
    RISE... 

    END;