En PL/SQL tenemos mecanismos para manejar las excepciones, que son generadas a partir de situaciones de error o advertencias. Estos son administrados por bloques relativamente sencillos de utilizarlos, la sintaxis más común es la siguiente:
1 2 3 4 5 6 7 | DECLARE -- Declaraciones objetos a utilizar BEGIN -- Ejecucion del proceso que desamos ejecutar EXCEPTION -- En caso de error, manejamos aqui la Excepcion END; |
En caso que querríamos un manejo más fino en caso de errores, podemos especificar el tipo de excepción y tratarlo de manera diferente según el caso, por ejemplo, si hay un login fallido podemos tener un procedimiento distinto a si la excepción fue sobrecarga de valor, al intentar asignar un valor más grande de lo que soporta el tipo. Sería asi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE -- Declaraciones objetos a utilizar BEGIN -- Ejecucion del proceso que desamos ejecutar EXCEPTION WHEN LOGIN_DENIED THEN -- Se ejecuta cuando el programa intentó conectarse a Oracle con un nombre de usuario o password inválido WHEN VALUE_ERROR THEN -- Se ejecuta cuando ocurrió un error aritmético, de conversión o truncamiento. -- Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable más pequeña WHEN OTHERS THEN -- Se ejecuta cuando ocurre una excepcion de un tipo no tratado -- en los bloques anteriores END; |
Como vemos en el caso anterior, la sentencia WHEN OTHERS THEN debe ir al final de la lista de casos, si no colocamos esto una vez creada una lista de excepciones y nuestra excepción no es de ningún tipo de los que verificamos, no habrá control del mismo.
Existe una lista bastante extensa de excepciones predefinidas, las cuales pueden verla en la documentación oficial, listarla aquí sería algo largo.
También podemos capturar el número de error y el mensaje completo con 2 comandos el SQLCODE y SQLERRM respectivamente, son muy utililes para comprender las expciones que son controladas dentro del bloque OTHERS
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE errno NUMBER; errmsg VARCHAR2(255); . . EXCEPTION WHEN OTHERS THEN errno := SQLCODE; errmsg := SQLERRM; -- ahora ya podemos utilizar estas variables para lo que querramos END; |
Además de las predefinidas, el usuario puede crear sus propias excepciones, personalizarlas según su necesidad por así decirlo. Con la sentencia RAISE podemos lanzar la excepción en el momento que querramos, si se fijan en el siguiente ejemplo verán que creamos un tipo de excepción personalizado y lo lanzamos manualmente para luego ser controlado.
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE -- Declaramos una excepcion llamada NO_NULL VALOR_NULL EXCEPTION; -- variable para comparar luego texto VARCHAR(15); BEGIN IF texto IS NULL THEN RAISE VALOR_NULL; END IF; EXCEPTION WHEN VALOR_NULL THEN dbms_output.put_line('> No se permiten valores nulos'); END; |
Tambien podemos crear una excepción para que sea capturada por alguna aplicación y no sea administrada completamente desde la base de datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE -- Declaramos una excepcion llamada NO_NULL VALOR_NULL EXCEPTION; -- variable para comparar luego texto VARCHAR(15); BEGIN IF texto IS NULL THEN RAISE VALOR_NULL; END IF; EXCEPTION WHEN VALOR_NULL THEN RAISE_APPLICATION_ERROR(-20001,'No se permiten valores nulos'); END; |







en
en
Excelente! me ha sido de gran ayuda.