Está en la página 1de 17

PL/SQL

Excepciones

Acciones
Concepto de excepcin
Identificador de PL/SQL que surge durante la ejecucin

Causas
Error Oracle Provocado explcitamente

Acciones
Interrumpirlo con un manejador Propagarlo al entorno de llamadas

Gestin d G ti de excepciones i
Interrumpir la Excepcin
DECLARE BEGIN
Surge la excepcin

Propagar la Excepcin
DECLARE BEGIN
Surge l excepcin S la i

EXCEPTION
Se interrumpe la excepcin i

EXCEPTION END;
No se interrumpe la excepcin

END;

p propaga La excepcin se p p g al entorno de llamadas

Tipos d excepciones Ti de i
Predefinidas por el Servidor Oracle No predefinida por el Servidor Provocada implcitamente

Definida por el usuario

Provocada explcitamente

Interrupcin de excepciones I t i d i
EXCEPTION WHEN excepcin1 [OR excepcin2 . . .] THEN sentencia1; sentencia2; . . . [WHEN excepcin3 [OR excepcin4 . . .] THEN sentencia1; sentencia2; . . .] [WHEN OTHERS THEN sentencia1; sentencia2; . . .]

Directrices para interrumpir excepciones


WHEN OTHERS es la ltima clusula La palabra clave EXCEPTION inicia la seccin p de gestin de excepciones Se permiten varios manejadores de excepciones Slo se procesa un manejador antes de salir del bloque

Interrupcin de Errores Predefinidos por el Servidor Oracle


Haga referencia al nombre estndar en la rutina de gestin de excepciones Ejemplos de excepciones predefinidas
NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR INVALID CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX DUP VAL ON INDEX LOGIN_DENIED

Ejercicio Ej i i
Del nombre de un empleado introducido durante ACCEPT crea un bloque PL/SQL que devuelva su nmero y su salario. Trata los siguientes casos mostrando el mensaje correspondiente:
No existe ningn empleado con ese nombre Existen varios empleados con ese nombre Se produce otro error distinto

Interrupcin de errores no predefinidos por el Servidor Oracle


Declare Asociar Referenciar
Seccin de gestin de excepciones Gestionar la excepcin

Seccin declarativa

Nombrar la excepcin

Codificar la PRAGMA EXCEPTION_INIT

Ejercicio Ej i i
Intente borrar todos los registros de la tabla departamento Mire el nmero de excepcin que aparece Cree un bloque PL/SQL que interrumpa una violacin de dicha excepcin (la excepcin debe surgir del intento de borrar los registros de la tabla departamento dentro de l parte t bl d t t d t d la t ejecutable) y muestre un mensaje indicando que no se pueden borrar departamentos con empleados.

Interrupcin de Excepciones definidas por el usuario


Declare
Seccin S i declarativa Especifique la excepcin

Raise
Seccin S i Ejecutable Provoque explcitamente la excepcin utilizando la sentencia RAISE

Reference
Seccin d gestin S i de ti De excepciones Gestione la excepcin

Ejercicio Ej i i
Cree un bloque PL/SQL que dado el nombre de un empleado nos devuelva su salario. Compruebe el caso de que gane menos de 1000 dlares. Si esto ocurre provoque una excepcin y gestinela mostrando el mensaje El empleado XXXX est siendo explotado. l d t i d l t d Cambie XXXX por el nombre del empleado.

Funciones para interrumpir excepciones


SQLCODE
Devuelve el valor numrico del cdigo de error

SQLERRM
Devuelve el mensaje asociado con el nmero de error

Entornos de llamada
ENTORNO SQL*PLUS Procedure Builder Developer / Forms Aplicacin del precompilador Bloque PL/SQL continente TRATAMIENTO DE EXCEPCIONES Muestra en la pantalla el mensaje y el nmero de error Muestra en la pantalla el mensaje y el nmero de error Accede al mensaje y nmero de error en un disparador por medio de funciones empaquetadas ERROR_CODE y ERROR_TEXT Accede al nmero de excepcin con la estructura de datos SQLCA Interrumpe la excepcin en la rutina de gestin de excepciones del bloque en el que se encuentra

Propagacin d excepciones P i de i
Los subbloques pueden gestionar una excepcin o transferirla al bloque que lo contiene
DECLARE ... e_no_rows exception; e_integrity exception; PRAGMA EXCEPTION_INIT (e_integrity, -2292); BEGIN FOR c_record IN emp_cursor LOOP BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_rows; END IF; EXCEPTION WHEN e_integrity THEN ... WHEN e no rows THEN ... END; END LOOP; EXCEPTION WHEN NO DATA FOUND THEN . . . NO_DATA_FOUND WHEN TOO_MANY_ROWS THEN . . . END;

RAISE_APPLICATION_ERROR
raise_application_error (error_number, message[, {TRUE | FALSE}]);

Un procedimiento que le permite emitir mensajes de error definidos por el usuario desde subprogramas almacenados Slo se le puede llamar desde un subprograma almacenado Se utiliza en la seccin ejecutable y en la seccin de excepciones Devuelve condiciones de error al usuario con otros errores del servidor de forma consistente.

Ejercicios Ej i i
Prcticas Tema 9 Curso Oracle

También podría gustarte