Excepciones en Oracle / PLSQL
Están nombrados en el paquete STANDARD en PL/SQL y no necesitan ser definidos por el programador.
La sección de EXCEPTION es la encargada de recoger todas las anomalías que se puedan producir dentro del bloque de código PL/SQL.
Este tutorial de Oracle explica cómo usar las Excepciones en Oracle / PLSQL con sintaxis y ejemplos.
Oracle tiene un conjunto estándar de excepciones ya nombrado de la siguiente manera:
Listado de excepciones.
Nombre de excepción | Código de error | Explicación |
---|---|---|
DUP_VAL_ON_INDEX | ORA-00001 | Este error se debe a que se ha intentado ejecutar un INSERT o un UPDATE que intenta crear una fila con un valor duplicado en un campo restringido pon un UNIQUE INDEX. |
TIMEOUT_ON_RESOURCE | ORA-00051 | Ha acabado el tiempo de espera destinado a la consecución de un recurso. |
TRANSACTION_BACKED_OUT | ORA-00061 | La parte remota de la transacción ha hecho rollback.. |
INVALID_CURSOR | ORA-01001 | Esta trantado de utilizar un CURSOR que ya no existe. |
NOT_LOGGED_ON | ORA-01012 | Está intentando ejecutar una llamada a Oracle antes de validarse. |
LOGIN_DENIED | ORA-01017 | Está tratando de validarse contra Oracle usando una combinación errónea de usuario/clave. |
NO_DATA_FOUND | ORA-01403 | Está sucediendo una de las siguientes cosas:
|
TOO_MANY_ROWS | ORA-01422 | Está tratando de ejecutar una consulta SELECT INTO que devuelve más de una fila. |
ZERO_DIVIDE | ORA-01476 | Está tratando de dividir por cero. |
INVALID_NUMBER | ORA-01722 | Está tratando de ejecutar una sentencia SQL que trata de convertir una cadena en número, pero no ha funcionado. |
STORAGE_ERROR | ORA-06500 | Se ha producido un desbordamiento de la memoria y la memoria esta corrompida. |
PROGRAM_ERROR | ORA-06501 | Respuesta genérica a un error interno de Oracle. |
VALUE_ERROR | ORA-06502 | Se ha producido un error de conversión, truncamiento, o restricción (constraint) de un valor numérico o de carácter. |
CURSOR_ALREADY_OPEN | ORA-06511 | Está intentando abrir un cursor que ya está abierto. |
Sintaxis
La sintaxis de las excepciones en procedimientos y funciones.
Sintaxis de procedimientos
La sintaxis para la excepción en un procedimiento es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CREATE [OR REPLACE] PROCEDURE NOMBRE_PROCEDIMIENTO [(param1 |IN|OUT|IN OUT| TIPO_DATO, param2 |IN|OUT|IN OUT| TIPO_DATO ), … ] IS --Declaración de variables locales BEGIN --Declaración de Sentencia EXCEPTION WHEN NOMBRE_EXCEPTION1 THEN [Declaración de Sentencia] WHEN NOMBRE_EXCEPTION2 THEN [Declaración de Sentencia] WHEN NOMBRE_EXCEPTION_N THEN [Declaración de Sentencia] WHEN OTHERS THEN [Declaración de Sentencia] END NOMBRE_PROCEDIMIENTO |
La sintaxis de la excepción en una función es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
CREATE [OR REPLACE] FUNCTION NOMBRE_FUNCION [(param1 |IN|OUT|IN OUT| TIPO_DATO, param2 |IN|OUT|IN OUT| TIPO_DATO ), … ] RETURN TIPO_DATO IS | AS --Declaración de variables locales BEGIN --Declaración de Sentencia RETURN DATO; EXCEPTION WHEN NOMBRE_EXCEPTION1 THEN [Declaración de Sentencia] WHEN NOMBRE_EXCEPTION2 THEN [Declaración de Sentencia] WHEN NOMBRE_EXCEPTION_N THEN [Declaración de Sentencia] WHEN OTHERS THEN [Declaración de Sentencia] END NOMBRE_FUNCION |
Ejemplo
A continuación, se muestra un ejemplo de un procedimiento que utiliza una excepción
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
CREATE OR REPLACE PROCEDURE P_INS_CLIENTES(P_CODIGOCLIENTE IN CLIENTE.CODIGOCLIENTE%TYPE, P_NOMBRECLIENTE IN CLIENTE.NOMBRECLIENTE%TYPE) IS BEGIN INSERT INTO CLIENTE (CODIGOCLIENTE, NOMBRECLIENTE) VALUES (P_CODIGOCLIENTE, P_NOMBRECLIENTE); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20001, 'Ha intentado insertar un duplicado codigocliente.'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20002, 'Se ha producido un error al insertar un cliente.'); END; |
En este ejemplo, estamos atrapando la Excepción llamada DUP_VAL_ON_INDEX. También estamos usando la cláusula WHEN OTHERS para atrapar a todos los errores
En conclusión
Si existe un bloque de excepcion apropiado para el tipo de excepción que esta ejecuta dicho bloque. Si no existe un bloque de control de excepciones adecuado al tipo de excepcion se ejecutará el bloque de excepcion WHEN OTHERS THEN (si existe!). WHEN OTHERS debe ser el último manejador de excepciones.