Oracle también permite que nosotros lancemos nuestros propios mensajes de error a las aplicaciones y asociarlos a un código de error que Oracle reserva, para no interferir con los demás códigos de error. Lo hacemos por medio del procedimiento:
RAISE_APPLICATION_ERROR(error_number, message [, (TRUE|FALSE)]);
Donde error_number
es un entero negativo comprendido entre –20000..-20999 y message
es una cadena que devolvemos a la aplicación. El tercer parámetro especifica si el error se coloca en la pila de errores (TRUE
) o se vacía la pila y se coloca únicamente el nuestro (FALSE
). Sólo podemos llamar a este procedimiento desde un subprograma.
No hay excepciones predefinidas asociadas a todos los posibles errores de Oracle, por lo que nosotros podremos asociar excepciones definidas por nosotros a errores Oracle, por medio de la directiva al compilador (o pseudoinstrucción):
PRAGMA_INIT( nombre_excepcion, error_Oracle )
Donde nombre_excepcion
es el nombre de una excepción definida anteriormente, y error_Oracle
es el número negativo asociado al error.
DECLARE
no_null EXCEPTION;
PRAGMA EXCEPTION_INIT(no_null, -1400);
id familias.identificador%TYPE;
nombre familias.nombre%TYPE;
BEGIN
...
nombre := NULL;
...
INSERT INTO familias VALUES (id, nombre, null, null);
EXCEPTION
WHEN no_null THEN
...
END;
Oracle asocia 2 funciones para comprobar la ejecución de cualquier sentencia. SQLCODE
nos devuelve el código de error y SQLERRM
devuelve el mensaje de error asociado. Si una sentencia es ejecutada correctamente, SQLCODE
nos devuelve 0 y en caso contrario devolverá un número negativo asociado al error (excepto NO_DATA_FOUND
que tiene asociado el +100).
DECLARE
cod number;
msg varchar2(100);
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
cod := SQLCODE;
msg := SUBSTR(SQLERRM, 1, 1000);
INSERT INTO errores VALUES (cod, msg);
END;