2 de febrero de 2015

Excepciones Oracle

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.