lunes, 30 de noviembre de 2009

excepciones en oracle

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 THEN ; ...... [WHEN OTHERS THEN ;]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'SQLCODESQLERRM.)
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 número de error está 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;

No hay comentarios:

Publicar un comentario