Está en la página 1de 4

Las excepciones en el sistema gestor Oracle y el lenguaje PL/SQL, nos ayudan a detectar y tratar errores en tiempo de ejecucin.

En este artculo del Manual de PL/SQL de Oracle vamos a ver lo que son las excepciones, para qu sirven y cmo utilizarlas. Daremos un repaso tambin a los tipos de excepciones, las excepciones definidas por el usuario y la sintaxis con la que tenemos que especificarlas. Por ltimo, de paso que vemos cosas acerca del tratamiento de errores en PL/SQL, explicaremos el RAISE_APPLICATION_ERROR, un componente del sistema gestor de base de datos Oracle que ayuda a gestionar errores y sus mensajes de error.

Qu son las excepciones en Oracle


Las excepciones, presentes en la mayora de los lenguajes de programacin, sirven para tratar errores en tiempo de ejecucin. En el sistema que nos ocupa, Oracle, sirven tambin para definir qu se debe hacer frente a errores en sentencias definidas por el usuario. Cuando se produce un error PL/SQL levanta una excepcin y pasa el control a la seccin excepcin correspondiente al bloque PL/SQL. El formato sera el siguiente:

BEGIN ......... ...... ...... EXCEPTION WHEN <nombre_excepcin> THEN <instrucciones>; ...... [WHEN OTHERS THEN <instrucciones>;] END;

Excepciones predefinidas
Son aquellas que se disparan automticamente al producirse determinados errores. Estas son las ms comunes:

too_many_rows: Se produce cuando select into devuelve ms de una fila. no_data_found: se produce cuando un select . into no devuelve ninguna fila. login_denied: error cuando intentamos conectarnos a Oracle con un login y clave no validos. not_logged_on: se produce cuando intentamos acceder a la base de datos sin estar conectados. program_error: se produce cuando hay un problema interno en la ejecucin del programa. value_error: se produce cuando hay un error aritmtico o de conversin. zero_divide: se puede cuando hay una divisin entre 0. dupval_on_index: se crea cuando se intenta almacenar un valor que creara duplicados en la clave primaria o en una columna con restriccin UNIQUE. invalid_number: se produce cuando se intenta convertir una cadena a un valor numrico. Hay alguna ms pero estas son las ms utilizadas y tenemos que tener en cuenta que no es necesario declararlas en la seccin DECLARE.

Excepciones definidas por el usuario


Son aquellas que crea el usuario. Para ello se requieren tres pasos: 1. Definicin: se realiza en la zona de DECLARE con el siguiente formato: nombre_excepcin EXCEPTION 2. Disparar o levantar la excepcin mediante la orden raise: RAISE ; 3. Tratar la excepcin en el apartado EXCEPTION: WHEN THEN ;

Para que esto quede ms claro ponemos un ejemplo a continuacin.

DECLARE ... Importe_mal EXCEPTION; ... BEGIN ... IF precio NOT BETWEEN mnimo and mximo THEN RAISE importe_mal; END IF; ...

EXCEPTION WHEN importe_mal THEN DBMS_OUTPUT.PUT_LINE("Importe incorrecto"); ... END;

Otras excepciones
Existen otros errores internos de Oracle que no tienen asignada una excepcin, sino un cdigo de error y un mensaje, a los que se accede mediante funciones SQLCODE y SQLERRM. Cuando se produce un error de estos se trasfiere directamente el control a la seccin EXCEPTION donde se tratara el error en la clausula WHEN OTHERS de la siguiente forma:

WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error'||SQLCODE||SQLERRM.)

Utilizacin de RAISE_APPLICATION_ERROR
En el paquete DBMS_STANDARD se incluye un procedimiento llamado RAISE_APPLICATION_ERROR que nos sirve para levantar errores y definir mensajes de error. Su formato es el siguiente:

RAISE_APPLICATION_ERROR(numero_error,mensaje_error);

Es importante saber que el numero de error esta comprendido entre -20000 y -20999 y el mensaje es una cadena de caracteres de hasta 512 bytes. Este procedimiento crea una excepcin que solo puede ser tratada en WHEN OTHERS. Ponemos un ejemplo para que nos quede ms claro.

CREATE or REPLACE PROCEDURE subir_horas (emple NUMBER, horas_subir NUMBER) IS horas_actuales NUMBER; BEGIN Select horas into horas_actuales from empleados where id_empleado=emple; if horas_actuales is NULL then RAISE_APPLICATION_ERROR(-20010,'No tiene horas'); else update empleados set horas=horas_actuales + horas_subir where id_empleado=emple;

end if; End subir_horas;

También podría gustarte