2011-08-28 33 views
7

Tôi đang sử dụng nhà phát triển sql và đã thêm một ràng buộc vào một trong các bảng của tôi.Bắt vi phạm ràng buộc trong psql

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

Khi tôi cố gắng thêm mục nhập có ký tự 'x' cho giới tính sử dụng thủ tục xin lỗi, không thành công do vi phạm ràng buộc (như nó phải).

Tôi muốn thêm "Catch" vào thủ tục plsql để nếu valid_gender bị làm hỏng, tôi có thể raise_application_error cụ thể cho nó. Điều này có thể không?

Trả lời

8

Oracle sẽ nâng cao một ngoại lệ mà nói:

ORA-02.290: kiểm tra ràng buộc (yourschema.valid_gender) vi phạm

Bạn có thể bắt rằng trong một trình xử lý ngoại lệ và nâng cao ngoại lệ riêng của bạn thay sử dụng raise_application_error theo một vài cách.

1) Bạn có thể đặc biệt bẫy ngoại trừ ORA-02.290 như thế này:

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) Bạn có thể bẫy tất cả các trường hợp ngoại lệ và kiểm tra chúng:

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; 

Trong một ứng dụng lớn nó là khá phổ biến để có một thủ tục xử lý ngoại lệ để khái quát hóa điều này và tra cứu thông báo ràng buộc cụ thể trong một bảng.

+0

thankyou rất nhiều – luke

+0

tôi sẽ 2 hoặc 3 nếu tôi có thể :) –

+0

đây là câu trả lời phù hợp hơn, cảm ơn bạn – chulian

0

Bạn chỉ có thể kiểm tra nó trước:

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

sử dụng khối người nặc danh trong mã của bạn ...

BEGIN 
    INSERT or update... 

    EXCEPTION 
    WHEN dup_val_on_index THEN 
    RISE... 

    END; 
Các vấn đề liên quan