Um exemplo mínimo é:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Se você fizer:
SELECT raise_exception
FROM DUAL;
Você obterá uma única linha contendo um
NULL
value - Pergunte ao Tom afirma:e depois seguiu com:
Portanto, a exceção é levantada na função e o cliente SQL vê isso e interpreta isso, pois não há dados que sejam
NULL
value e "trata" a exceção. Então
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Terá sucesso como o
DUAL
table tem uma única linha e a exceção da função será tratada (silenciosamente) e a variável acabará contendo um NULL
valor. No entanto,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
A exceção desta vez está sendo passada da função para um escopo PL/SQL - que não trata o erro e passa a exceção para o bloco do manipulador de exceção (que não existe), então é passado para o escopo do aplicativo e encerra a execução do programa.
E Pergunte ao Tom afirma:
Agora, se alterarmos a função para gerar uma exceção diferente:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Então ambos:
SELECT raise_exception
FROM DUAL;
e:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
não sei como tratar a exceção e terminar com
ORA-01476 divisor is equal to zero
.