Một ví dụ tối thiểu là:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Nếu bạn làm như vậy:
SELECT raise_exception
FROM DUAL;
Bạn sẽ nhận được một hàng có chứa NULL
value - Hỏi Tom trạng thái:
và sau đó theo dõi với:
Vì vậy, ngoại lệ được đưa ra trong hàm và máy khách SQL thấy điều này và giải thích điều này là không có dữ liệu nào là NULL
giá trị và "xử lý" ngoại lệ.
Vì vậy,
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Sẽ thành công dưới dạng DUAL
bảng có một hàng duy nhất và ngoại lệ từ hàm sẽ được xử lý (âm thầm) và biến sẽ chứa một NULL
giá trị.
Tuy nhiên,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Ngoại lệ là lần này được chuyển từ hàm sang phạm vi PL / SQL - không xử lý lỗi và chuyển ngoại lệ cho khối xử lý ngoại lệ (không tồn tại) để sau đó được chuyển đến phạm vi ứng dụng và chấm dứt thực thi của chương trình.
Và Ask Tom nói:
Bây giờ, nếu chúng ta thay đổi hàm để đưa ra một ngoại lệ khác:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Sau đó, cả hai:
SELECT raise_exception
FROM DUAL;
và:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
không biết cách xử lý ngoại lệ và kết thúc bằng ORA-01476 divisor is equal to zero
.