when then sqlerrm raise_application_error predefinidas others no_data_found manejo excepciones example ejemplos cursores oracle exception plsql exception-handling

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;