sql >> Base de Datos >  >> RDS >> Oracle

No se lanza la excepción NO_DATA_FOUND cuando se usa en SELECT INTO

Un ejemplo mínimo es:

CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE NO_DATA_FOUND;
END;
/

Si lo hace:

SELECT raise_exception
FROM   DUAL;

Obtendrá una sola fila que contiene un NULL valor - Preguntar a Tom estados:

y luego siguió con:

Entonces, la excepción se genera en la función y el cliente SQL ve esto e interpreta esto como que no hay datos que sean NULL value y "maneja" la excepción.

Entonces

DECLARE
  variable_name VARCHAR2(50);
BEGIN
  SELECT raise_exception
  INTO   variable_name
  FROM   DUAL
END;
/

Tendrá éxito como DUAL la tabla tiene una sola fila y la excepción de la función se manejará (silenciosamente) y la variable terminará conteniendo un NULL valor.

Sin embargo,

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

La excepción es que esta vez se pasa de la función a un ámbito PL/SQL, que no maneja el error y pasa la excepción al bloque del controlador de excepciones (que no existe), por lo que luego se pasa al ámbito de la aplicación y finaliza la ejecución. del programa.

Y Pregúntale a Tom dice:

Ahora, si cambiamos la función para generar una excepción diferente:

CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE ZERO_DIVIDE;
END;
/

Entonces ambos:

SELECT raise_exception
FROM   DUAL;

y:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

no sé cómo manejar la excepción y terminar con ORA-01476 divisor is equal to zero .