post icon

Manejo de Errores en Oracle

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;

Comentarios desde Facebook:

  1. Your Name GUATEMALA Google Chrome Windows
    27 abril 2011 at 21:24 #

    Excelente! me ha sido de gran ayuda. :smile:

Responder