Las excepciones sirven para tratar errores en tiempo de
ejecución, así como errores y
situaciones definidas por el usuario. Cuando se produce
un error, PL/SQL levanta una
excepción y pasa el control a la sección EXCEPTION
correspondiente del bloque PL, que
actuará según lo establecido y dará por finalizada la
ejecución del bloque actual.
El formato de la sección EXCEPTION es:
...
EXCEPTION
WHEN
THEN
WHEN
THEN
...
[WHEN OTHERS THEN
END [nombre_procedimiento_funcion];
Podemos
diferenciar tres tipos de excepciones disponibles:
EXCEPCIONES INTERNAS PREDEFINIDAS O DE SISTEMA
Están predefinidas por Oracle. Se disparan
automáticamente al producirse
determinados errores. No necesitan declaración en las
sección DECLARE.
Las excepciones más frecuentes son las siguientes, en
ellas se indican cuando se
producen o se disparan:
ACCESS_INTO_NULL: Se intenta acceder a los atributos de un
objeto no
inicializado.
COLLECTION_IS_NULL: Se intenta acceder a elementos de una
colección que no
ha sido inicializada.
CURSOR_ALREADY_OPEN: Intentamos abrir un cursor que ya se
encuentra
abierto.
DUP_VAL_ON_INDEX: Se intenta almacenar un valor que crearía
duplicados en la
clave primaria o en una columna con la restricción
UNIQUE.
INVALID_CURSOR: Se intenta realizar una operación no
permitida sobre un cursor
(por ejemplo, cerrar un cursor que no se ha abierto).
INVALID_NUMBER: Fallo al intentar convertir una cadena a un
valor numérico.
LOGIN_DENIED: Se intenta conectar a Oracle con un usuario o
una clave no
válidos.
NOT_LOGGED_ON: Se intenta acceder a la base de datos sin
estar conectado a
Oracle.
NO_DATA_FOUND: Una sentencia SELECT … INTO … no devuelve
ninguna fila.
PROGRAM_ERROR: Hay un problema interno en la ejecución del
programa.
ROWTYPE_MISMATCH: La variable del cursor del Host y la variable
de cursor
Pl/SQL pertenecen a tipos incompatibles.
SUBSCRIPT_OUTSIDE_LIMIT: Se intenta acceder a una tabla
anidada o a un
array con un valor de índice ilegal (por ejemplo,
negativo).
STORAGE_ERROR: El bloque PL/SQL se ejecuta fuera de memoria
(error de
memoria).
TIMEOUT_ON_RESOURCE: Se excede el tiempo de espera para un
recurso.
TOO_MANY_ROWS: Una sentencia SELECT … INTO … devuelve más de
una
fila.
VALUE_ERROR: Un error de tipo aritmético, de conversión, de
truncamiento…
ZERO_DIVIDE: Se intenta la división entre cero.
Ejemplo:
DECLARE
…
BEGIN
…
EXCEPTION
WHEN
NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE (‘ERROR, datos no
encontrados’);
WHEN
TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE (‘ERROR, demasiadas filas
recuperadas’);
END;
EXCEPCIONES DEFINIDAS POR EL USUARIO.
También podemos asociar una excepción a alguno de estos
errores internos que
no tienen excepciones predefinidas asociadas, de la
siguiente manera:
1- Definimos una excepción en la sección de declaraciones
como si fuese una
excepción definida por el usuario:
EXCEPTION;
2- Asociamos esa excepción a un determinado código de
error mediante la
directiva del compilador PRAGMA EXCEPTION_INIT, según el
formato
siguiente:
PRAGMA EXCEPTION_INIT (,
3- Indicamos el tratamiento que recibirá la excepción en
sección EXCEPTION
como si se tratase de cualquier otra expresión definida o
predefinida. Ejemplo:
DECLARE
…
err_externo EXCEPTION; - - Se define la excepción de
usuario
…
PRAGMA EXCEPTION_INIT (err_externo, 1547); - - Asociamos
a error
Oracle
…
BEGIN
/* No hay que
levantar la excepción, ya que llegado el caso Oracle lo hará. */
…
EXCEPTION
…
WHEN err_externo
THEN - - Se trata como cualquier otra
END;
OTRAS EXCEPCIONES
Existen otros errores internos de Oracle, similares a los
asociados a las
excepciones internas pero que no tienen asociadas ninguna
excepción, sino un
código de error y un mensaje de error, a los que se
accede a través de las
funciones SQLCODE y SQLERRM. Cuando se produce uno de
estos errores se
transfiere el control a la sección EXCEPTION dónde se
tratará el error en la
cláusula
WHEN OTHERS.
Ejemplo:
EXCEPTION
…
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (‘Error: | | SQLCODE | |
SQLERRM);
…
END;
En este ejemplo se muestra al usuario el texto ‘ERROR’
con el CODIGO DE
ERROR y el MENSAJE DE ERROR utilizando las funciones
correspondientes.