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
.