2012-01-12 38 views
10

Tôi đang học PL/SQL những ngày này và hiện đang làm việc với Thủ tục và ngoại lệ bằng lược đồ HR oracle.Ngoại lệ PL/SQL trên Cập nhật/Xóa hàng không tồn tại

Đây là thủ tục đơn giản của tôi.

create or replace 
PROCEDURE DEL_JOB 
(p_jobid jobs.job_id%TYPE) 
AS 
sqle NUMBER; 
sqlm VARCHAR2(300); 
BEGIN 
DELETE FROM JOBS 
WHERE JOB_ID = UPPER(p_jobid); 
IF SQL%NOTFOUND THEN 
    DBMS_OUTPUT.PUT_LINE('No such record'); 
END IF; 
EXCEPTION 
WHEN OTHERS THEN 
    sqle := SQLCODE; 
    sqlm := SQLERRM; 
    DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted'); 
    DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm); 
END; 

Khi tôi thực hiện thủ tục này đầu ra là

No such record 
    PL/SQL procedure successfully complete. 

Tuy nhiên, theo Oracle PDF cần ném một ngoại lệ và tôi thực sự sẽ nhận được thông điệp mà tôi nhập vào là ngoại lệ.

Điều tương tự cũng xảy ra với bản Cập nhật về bản ghi không tồn tại. Vui lòng thông báo. Cảm ơn

Trả lời

10

Tôi tin rằng SQL%NOTFOUND trả về true khi không tìm thấy bản ghi nào. IF của bạn sẽ đánh giá đúng trong trường hợp đó, và do đó viết put_line của bạn vào thiết bị đầu cuối. Câu lệnh SQL được thực hiện thành công. Nếu bạn thực hiện câu lệnh SQL đó bằng chính dòng lệnh, bạn sẽ nhận được 0 hàng được cập nhật/xóa, chứ không phải lỗi Oracle.

Nếu bạn muốn loại trừ ngoại lệ, bạn có thể sử dụng RAISE bên trong số IF và trỏ nó vào ngoại lệ trong khối ngoại lệ bạn muốn ném.

+0

cảm ơn bạn Tôi chỉ muốn xác nhận không thiếu bất cứ điều gì. – MStp

8

Không có "ngoại lệ" - sql được thực thi thành công. Nó đã xóa thành công mọi bản ghi phù hợp với tiêu chí ... là 0 bản ghi. Điều tương tự nếu một câu lệnh cập nhật tương tự được thực thi. Bạn đã sử dụng SQL NOTFOUND để xác định không có hồ sơ nào bị ảnh hưởng, nhưng điều này không có nghĩa là có một "ngoại lệ".

Có lẽ bạn đang nghĩ đến ngoại lệ NO_DATA_FOUND được nêu ra nếu bạn thử một mệnh đề "chọn vào" và nó không tìm thấy bất kỳ bản ghi phù hợp nào.

+0

Có, tôi đã tìm giống nhau nhưng "Oracle Database 11g Phát triển PL/SQL Chương trình Units Vol1" pdf được nêu cần có ngoại lệ. Chỉ muốn xác nhận tôi không bỏ lỡ bất cứ điều gì, cảm ơn. – MStp

1

để làm như vậy bạn cần phải sử dụng

IF SQL%ROWCOUNT = 0 THEN 
    RAISE no_delete; 
END IF; 

và xác định trang

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