> Manuales > Tutorial de Oracle

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

En este artículo del Manual de PL/SQL de Oracle vamos a ver lo que son las excepciones, para qué sirven y cómo utilizarlas. Daremos un repaso también 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 mayoría de los lenguajes de programación, sirven para tratar errores en tiempo de ejecución. En el sistema que nos ocupa, Oracle, sirven también para definir qué se debe hacer frente a errores en sentencias definidas por el usuario. Cuando se produce un error PL/SQL levanta una excepción y pasa el control a la sección excepción correspondiente al bloque PL/SQL.

El formato sería el siguiente:

BEGIN
   .........
   ......
   ......
EXCEPTION
   WHEN <nombre_excepción> THEN
      <instrucciones>;
   ......
   [WHEN OTHERS THEN <instrucciones>;]
END;

Excepciones predefinidas

Son aquellas que se disparan automáticamente al producirse determinados errores. Estas son las más comunes:

too_many_rows: Se produce cuando select … into devuelve más 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 ejecución del programa.
value_error: se produce cuando hay un error aritmético o de conversión.
zero_divide: se puede cuando hay una división entre 0.
dupval_on_index: se crea cuando se intenta almacenar un valor que crearía duplicados en la clave primaria o en una columna con restricción UNIQUE.
invalid_number: se produce cuando se intenta convertir una cadena a un valor numérico.

Hay alguna más pero estas son las más utilizadas y tenemos que tener en cuenta que no es necesario declararlas en la sección DECLARE.

Excepciones definidas por el usuario

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

Para que esto quede más claro ponemos un ejemplo a continuación.

DECLARE
...
Importe_mal EXCEPTION;
...
BEGIN
...
IF precio NOT BETWEEN mínimo and máximo 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 excepción, sino un código 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 sección 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.)

Utilización 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 excepción que solo puede ser tratada en WHEN OTHERS.

Ponemos un ejemplo para que nos quede más 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;

Sara Alvarez

Equipo DesarrolloWeb.com

Manual