oracle - then - Manejo de excepciones PL/SQL: no hacer nada(ignorar excepción)
raise_application_error oracle (2)
Otro escenario cuando tiene sentido ignorar silenciosamente la excepción: cuando llama a un script que se espera que cree un objeto si no existe, y no tiene una sintaxis de crear o reemplazar para ese objeto. Los objetos PLSQL tienen una sintaxis de crear o reemplazar, pero las tablas y los índices no. Luego podemos poner dichos scripts en un bloque e ignorar la excepción planteada.
Esta es una pregunta que me hacen con mucha frecuencia. Como no pude encontrar ningún duplicado exacto en stackoverflow, pensé que lo publicaría como referencia.
Pregunta: En PL / SQL, sé cómo detectar excepciones y ejecutar código cuando se detectan, y cómo propagarlos al bloque de llamada. Por ejemplo, en el siguiente procedimiento, la excepción NO_DATA_FOUND se maneja directamente, mientras que todas las demás excepciones se elevan al bloque llamante:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
IS
BEGIN
do_stuff();
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Do something
handle_exception();
WHEN OTHERS THEN
-- Propagate exception
RAISE;
END;
Pero, ¿qué comando debo usar para ignorar una o todas las excepciones generadas y devolver el control de ejecución al bloque de llamada?
Si bien estoy de acuerdo en que el 99% del tiempo es una mala práctica ignorar silenciosamente las excepciones sin al menos registrarlas en alguna parte, hay situaciones específicas en las que esto es perfectamente aceptable.
En estas situaciones, NULL es tu amigo:
[...]
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
Dos situaciones típicas donde ignorar las excepciones pueden ser deseables son:
1) Su código contiene una declaración que sabe que fallará ocasionalmente y no desea que este hecho interrumpa el flujo de su programa. En este caso, debería incluir su declaración en un bloque anidado, como muestra el siguiente ejemplo:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
IS
l_empoyee_name EMPLOYEES.EMPLOYEE_NAME%TYPE;
BEGIN
-- Catch potential NO_DATA_FOUND exception and continue
BEGIN
SELECT EMPLOYEE_NAME
INTO l_empoyee_name
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 12345;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
RAISE;
END;
do_stuff();
EXCEPTION
WHEN OTHERS THEN
-- Propagate exception
RAISE;
END;
Tenga en cuenta que, por lo general, PL / SQL no permite el manejo de excepciones On Error Resume Next conocido desde Visual Basic, donde todas las excepciones se ignoran y el programa continúa ejecutándose como si nada hubiera pasado Oráculo PL / SQL ). Es necesario que incluya explícitamente declaraciones potencialmente fallidas en un bloque anidado.
2) Su procedimiento es tan poco importante que ignorar todas las excepciones que lanza no afectará la lógica de su programa principal. (Sin embargo, esto ocurre muy raramente y a menudo puede resultar en una pesadilla de depuración a largo plazo)
BEGIN
do_stuff();
EXCEPTION
WHEN OTHERS THEN
-- Ignore all exceptions and return control to calling block
NULL;
END;