Минимален пример е:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Ако го направите:
SELECT raise_exception
FROM DUAL;
Ще получите един ред, съдържащ NULL
стойност - Попитайте Том заявява:
и след това последва с:
Така че изключението се повдига във функцията и SQL клиентът вижда това и интерпретира това, тъй като няма данни, които са NULL
стойност и "обработва" изключението.
И така
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Ще успее като DUAL
таблицата има един ред и изключението от функцията ще бъде обработено (тихо) и променливата в крайна сметка ще съдържа NULL
стойност.
Въпреки това,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Изключението е, че този път се предава от функцията към PL/SQL обхват - който не обработва грешката и предава изключението на блока за обработка на изключения (който не съществува), така че след това се предава до обхвата на приложението и прекратява изпълнението на програмата.
И Попитайте Том гласи:
Сега, ако променим функцията, за да предизвикаме различно изключение:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
След това и двете:
SELECT raise_exception
FROM DUAL;
и:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
не знам как да се справя с изключението и да прекратя с ORA-01476 divisor is equal to zero
.