Está en la página 1de 21

Ing.

Javier David Garca Andonaire

En PL/SQL una advertencia o condicin de error es


llamada una excepcin.

Las excepciones se controlan dentro de su propio


bloque. La estructura de bloque de una excepcin se
muestra a continuacin:

Excepciones en PL/SQL

Cuando ocurre un error, se ejecuta la porcin del


programa marcada por el bloque EXCEPTION,
transfirindose el control a ese bloque de sentencias.
El siguiente ejemplo muestra un bloque de excepciones
que captura las excepciones NO_DATA_FOUND y
ZERO_DIVIDE. Cualquier otra excepcin ser
capturada en el bloque WHEN OTHERS THEN.

Cuando ocurre un error, se ejecuta el bloque


EXCEPTION, transfirindose el control a las sentencias
del bloque. Una vez finalizada la ejecucin del bloque de
EXCEPTION no se continua ejecutando el bloque
anterior.
Si existe un bloque de excepcin apropiado para el tipo
de excepcin se ejecuta dicho bloque. Si no existe un
bloque de control de excepciones adecuado al tipo de
excepcin se ejecutar el bloque de excepcin WHEN
OTHERS THEN (si existe!). WHEN OTHERS debe
ser el ltimo manejador de excepciones.

Las excepciones pueden ser definidas en forma interna o


explcitamente por el usuario. Ejemplos de excepciones
definidas en forma interna son la divisin por cero y la falta
de memoria en tiempo de ejecucin. Estas mismas
condiciones excepcionales tienen sus propio tipos y pueden
ser
referenciadas por
ellos:
ZERO_DIVIDE
y
STORAGE_ERROR.
Las excepciones definidas por el usuario deben ser
alcanzadas explcitamente utilizando la sentencia RAISE.
Con las excepciones se pueden manejar los errores
cmodamente sin necesidad de mantener mltiples chequeos
por cada sentencia escrita. Tambin provee claridad en el
cdigo ya que permite mantener las rutinas correspondientes
al tratamiento de los errores de forma separada de la lgica
del negocio.

PL/SQL proporciona un gran nmero de excepciones


predefinidas que permiten controlar las condiciones de
error ms habituales.

Las excepciones predefinidas no necesitan ser


declaradas. Simplemente se utilizan cuando estas son
lanzadas por algn error determinado.

Excepciones predefinidas

PL/SQL permite al usuario definir sus propias


excepciones, las que debern ser declaradas y lanzadas
explcitamente utilizando la sentencia RAISE.

Las excepciones deben ser declaradas en el segmento


DECLARE de un bloque, subprograma o paquete. Se
declara una excepcin como cualquier otra variable,
asignndole el tipo EXCEPTION. Las mismas reglas de
alcance aplican tanto sobre variables como sobre las
excepciones.

Excepciones definidas por el usuario

Una excepcin es vlida dentro de su mbito de alcance,


es decir el bloque o programa donde ha sido declarada.
Las excepciones predefinidas son siempre vlidas.

Como las variables, una excepcin declarada en un


bloque es local a ese bloque y global a todos los subbloques que comprende.

Reglas de Alcance

La sentencia RAISE permite lanzar una excepcin en


forma explcita. Es posible utilizar esta sentencia en
cualquier lugar que se encuentre dentro del alcance de la
excepcin.

La sentencia RAISE

Con la sentencia RAISE podemos lanzar una excepcin


definida por el usuario o predefinida, siendo el
comportamiento habitual lanzar excepciones definidas
por el usuario.

Recordar la existencia de la excepcin OTHERS, que


simboliza cualquier condicin de excepcin que no ha
sido declarada. Se utiliza comnmente para controlar
cualquier tipo de error que no ha sido previsto. En ese
caso, es comn observar la sentencia ROLLBACK en el
grupo de sentencias de la excepcin o alguna de las
funciones SQLCODE SQLERRM, que se detallan en
el prximo punto.

Al manejar una excepcin es posible usar las funciones


predefinidas SQLCode y SQLERRM para aclarar al usuario la
situacin de error acontecida.
SQLcode devuelve el nmero del error de Oracle y un 0 (cero)
en caso de xito al ejecutarse una sentencia SQL.
Por otra parte, SQLERRM devuelve el correspondiente mensaje
de error.
Estas funciones son muy tiles cuando se utilizan en el bloque de
excepciones, para aclarar el significado de la excepcin
OTHERS.
Estas funciones no pueden ser utilizadas directamente en una
sentencia SQL, pero s se puede asignar su valor a alguna
variable de programa y luego usar esta ltima en alguna
sentencia.

Uso de SQLCODE y SQLERRM

Tambin es posible entregarle a la funcin SQLERRM


un nmero negativo que represente un error de Oracle y
sta devolver el mensaje asociado.

RAISE_APPLICATION_ERROR

En ocasiones queremos enviar un mensaje de error


personalizado al producirse una excepcin PL/SQL.
Para ello es necesario utilizar la instruccin
RAISE_APPLICATION_ERROR;
La sintaxis general es la siguiente:

Siendo:
error_num es un entero negativo comprendido entre -20001
y -20999 .
mensaje la descripcin del error.

Excepciones personalizadas en PL/SQL

Una de las caractersticas ms interesantes de la


excepciones es la propagacin de excepciones.

Cuando se lanza una excepcin, el control se


transfiere hasta la seccin EXCEPTION del bloque
donde se ha producido la excepcin. Entonces se busca
un manejador vlido de la excepcin (WHEN
<excepcion> THEN, WHEN OTHERS THEN) dentro
del bloque actual.

En el caso de que no se encuentre ningn manejador


vlida el control del programa se desplaza hasta el bloque
EXCEPTION del bloque que ha realizado la llamada
PL/SQL.

Propagacin de excepciones en PL/SQL

Observemos el siguiente bloque de PL/SQL (Ntese que


se ha aadido una clausula WHERE 1=2 para provocar
una excepcin NO_DATA_FOUND).

La excepcin NO_DATA_FOUND se produce durante la


ejecucin de la funcin fn_fecha, pero como no existe
ningn manejador de la excepcin en dicha funcin, la
excepcin se propaga hasta el bloque que ha realizado la
llamada. En ese momento se captura la excepcin.

También podría gustarte