Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Exceção NO_DATA_FOUND não lançada quando usada em SELECT INTO


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 .