2009-01-13 21 views
32

Nói rằng tôi có một khối Oracle PL/SQL chèn một bản ghi vào một bảng và cần phải phục hồi từ một lỗi khó khăn độc đáo, như thế này:Làm thế nào để nắm bắt một lỗi ràng buộc duy nhất trong một khối PL/SQL?

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

Có thể thay thế ellipsis cho một cái gì đó để bắt một lỗi ràng buộc duy nhất?

+0

Để sử dụng ngoại lệ, cách này hơi chậm vì việc tăng ngoại lệ mất khá nhiều thời gian. Thử hợp nhất. – tuinstoel

+1

Đồng ý. Nhưng hãy nhớ rằng ví dụ này chỉ là một trong nhiều trường hợp sử dụng có thể. Câu hỏi thực sự là "id cho lỗi ràng buộc duy nhất là gì?". Đó là lý do tại sao tôi đã bình chọn câu trả lời của William nhưng đã chấp nhận Ricardo. –

+2

Trường hợp ngoại lệ trong mã PL/SQL không đắt bằng ngôn ngữ cấp quản lý hoặc cấp cao (C#, Java). Trong một ứng dụng DB, "chậm chạp" thực sự là do truy cập db, một chi phí ngoại lệ PL/SQL là không đáng kể trong ngữ cảnh này –

Trả lời

55
EXCEPTION 
     WHEN DUP_VAL_ON_INDEX 
     THEN 
     UPDATE 
+2

làm cách nào bạn có thể viết ra giá trị gây ra sự cố? –

+0

Hãy kiểm tra điều này .. http://www.orafaq.com/forum/t/13889/2/ –

11

tôi nghi ngờ điều kiện bạn đang tìm kiếm là 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

làm thế nào bạn có thể viết ra giá trị gây ra vấn đề? –

+0

khi ngoại lệ bị bắt, chạy một truy vấn mới chỉ chọn ra các bản sao và báo cáo chúng. – EvilTeach

+0

bạn có thể làm điều đó trước khi chạy truy vấn? –

24

tôi chắc chắn rằng bạn có lý do của bạn, nhưng chỉ trong trường hợp ... bạn cũng nên xem xét sử dụng một "hợp nhất" truy vấn thay vào đó:

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; 

(sửa đổi ở trên để ở trong khối bắt đầu/kết thúc; rõ ràng bạn cũng có thể chạy nó một cách độc lập).

+1

Điều này giúp với trường hợp sử dụng cụ thể này, nhưng nó chỉ là một ví dụ. Câu hỏi thực sự là về id cho một lỗi ràng buộc duy nhất, vì vậy tôi upvoting câu trả lời này bởi vì nó thực sự là hữu ích, nhưng Ricardo sẽ là một chấp nhận. –

+1

Câu trả lời của Ricardo là ngoại lệ chính xác, nhưng tôi nghĩ ý kiến ​​của William sẽ giúp nhiều người hơn về lâu dài. –

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