Manejo de excepciones en Oracle PL/SQL (Ejemplos)
⚡ Resumen inteligente
Manejo de excepciones en Oracle PL/SQL captura los errores de tiempo de ejecución que impiden la ejecución de un bloque, lo que permite al motor transferir el control a una sección EXCEPTION donde los manejadores predefinidos, definidos por el usuario y OTHERS responden, generan o propagan errores de forma segura.

¿Qué es el manejo de excepciones en PL/SQL?
Se produce una excepción cuando el motor PL/SQL encuentra una instrucción que no puede ejecutar debido a un error que surge en tiempo de ejecución. Estos errores no se detectan en tiempo de compilación y, por lo tanto, deben gestionarse únicamente en tiempo de ejecución.
Por ejemplo, si el motor PL/SQL recibe una instrucción para dividir un número entre cero, genera una excepción. Esta excepción solo se genera en tiempo de ejecución por el motor PL/SQL.
Una excepción impide que el programa continúe ejecutándose, por lo que, para evitar esta situación, es necesario capturar y gestionar el error por separado. Este proceso se denomina manejo de excepciones, en el que el programador gestiona el error que puede ocurrir durante la ejecución.
Sintaxis de manejo de excepciones
Las excepciones se gestionan a nivel de bloque. Cuando se produce una excepción en un bloque, el control abandona la parte de ejecución de dicho bloque y la excepción se gestiona en la sección de manejo de excepciones. Una vez gestionada la excepción, el control no puede regresar a la sección de ejecución del mismo bloque.
La siguiente ilustración muestra cómo la sección de ejecución y la sección de manejo de excepciones se ubican dentro de un único bloque PL/SQL:
La sintaxis que se muestra a continuación explica cómo capturar y gestionar una excepción.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Explicación de sintaxis:
- En la sintaxis anterior, el bloque de manejo de excepciones contiene una serie de condiciones WHEN para manejar las excepciones.
- Cada condición WHEN va seguida de un nombre de excepción que se espera que se genere en tiempo de ejecución.
- Cuando se produce una excepción en tiempo de ejecución, el motor PL/SQL busca esa excepción en particular en la sección de manejo de excepciones, comenzando por la primera cláusula WHEN y avanzando secuencialmente.
- Si encuentra un controlador para la excepción que se generó, ejecuta el código de ese controlador en particular.
- Si ninguna cláusula WHEN coincide con la excepción generada, el motor PL/SQL ejecuta la parte WHEN OTHERS, si está presente. Este manejador es común a todas las excepciones.
- Una vez ejecutado el controlador, el control abandona el bloque actual.
- Solo se puede ejecutar un controlador de excepciones por bloque en tiempo de ejecución. Una vez ejecutado, el motor omite los controladores restantes y abandona el bloque actual.
Nota: La instrucción WHEN OTHERS siempre debe colocarse al final de la secuencia. Cualquier controlador escrito después de WHEN OTHERS nunca se ejecuta, ya que el control sale del bloque una vez que WHEN OTHERS se ha ejecutado.
Tipos de excepción
Hay dos tipos de excepciones en PL / SQL.
- Excepciones predefinidas
- Excepciones definidas por el usuario
Excepciones predefinidas
Oracle tiene predefinidas algunas excepciones comunes. Cada excepción predefinida tiene un nombre y un número de error únicos, y todas ellas están declaradas en el paquete STANDARD en OracleEn el código, puede usar estos nombres de excepciones predefinidos directamente para manejar los errores correspondientes. Muchos de ellos se corresponden directamente con excepciones comunes. SQL errores con los que te encuentras todos los días.
A continuación se presentan algunas excepciones predefinidas:
| Excepción | Error Code | Razón de excepción |
|---|---|---|
| ACCESO_INTO_NULL | ORA-06530 | Asignar un valor a los atributos de un objeto no inicializado. |
| CASO_NO_ENCONTRADO | ORA-06592 | Ninguna de las cláusulas WHEN en una instrucción CASE se cumple y no se especifica ninguna cláusula ELSE. |
| COLLECTION_IS_NULL | ORA-06531 | Utilizar métodos de colección (excepto EXISTS) o acceder a atributos de colección en una colección no inicializada. |
| CURSOR_ALREADY_OPEN | ORA-06511 | Tratando de abrir un cursor que ya está abierto |
| DUP_VAL_ON_INDEX | ORA-00001 | Almacenar un valor duplicado en una columna de base de datos que está restringida por un índice único. |
| INVALID_CURSOR | ORA-01001 | Operaciones ilegales con el cursor, como cerrar un cursor que no está abierto. |
| NÚMERO INVALIDO | ORA-01722 | La conversión de un carácter a un número falló debido a un carácter numérico no válido. |
| DATOS NO ENCONTRADOS | ORA-01403 | Una sentencia SELECT que contiene una cláusula INTO no recupera ninguna fila. |
| ROW_MISCATCH | ORA-06504 | El tipo de datos de la variable cursor es incompatible con el tipo de retorno real del cursor. |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Referenciar una colección mediante un número de índice mayor que el tamaño de la colección. |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Referenciar una colección mediante un número de índice fuera del rango legal (por ejemplo, -1). |
| TOO_MANY_ROWS | ORA-01422 | Una instrucción SELECT con una cláusula INTO devuelve más de una fila. |
| VALOR_ERROR | ORA-06502 | Un error aritmético o de restricción de tamaño (por ejemplo, asignar un valor mayor que el tamaño de la variable). |
| ZERO_DIVIDE | ORA-01476 | Dividir un número entre cero |
Excepción definida por el usuario
Además de las excepciones predefinidas mencionadas anteriormente, un programador puede crear excepciones personalizadas y gestionarlas. Estas se crean a nivel de subprograma, en la sección de declaración, y solo son visibles dentro de dicho subprograma. Una excepción definida en la especificación de un paquete es una excepción pública y es visible desde cualquier lugar donde se pueda acceder al paquete.
Sintaxis: A nivel de subprograma
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- En la sintaxis anterior, la variable 'exception_name' se define como de tipo EXCEPTION.
- Posteriormente, puede utilizarse del mismo modo que una excepción predefinida.
Sintaxis: A nivel de especificación del paquete
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- En la sintaxis anterior, la variable 'exception_name' se define como el tipo EXCEPTION en la especificación del paquete de .
- Se puede utilizar en toda la base de datos dondequiera que se pueda llamar al paquete 'package_name'.
Excepción de aumento de PL/SQL
Todas las excepciones predefinidas se generan implícitamente cuando se produce el error correspondiente. Sin embargo, las excepciones definidas por el usuario deben generarse explícitamente mediante la palabra clave RAISE. RAISE se puede utilizar de las formas que se muestran a continuación.
Si se utiliza RAISE de forma independiente dentro de un manejador, propaga la excepción ya generada al bloque padre. Solo se puede utilizar dentro de un bloque de excepciones, como se muestra a continuación.
La captura de pantalla que aparece a continuación muestra cómo se utiliza RAISE de forma aislada para volver a lanzar una excepción en el bloque que la contiene:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Explicación de sintaxis:
- En la sintaxis anterior, la palabra clave RAISE se utiliza dentro del bloque de manejo de excepciones.
- Siempre que el programa encuentre la excepción 'exception_name', esta se gestionará y finalizará con normalidad.
- La palabra clave RAISE en el manejador propaga entonces esa misma excepción al programa padre.
Nota: Al generar una excepción en el bloque padre, la excepción que se genera también debe ser visible en el bloque padre; de lo contrario Oracle arroja un error.
También puede usar la palabra clave RAISE seguida del nombre de la excepción para generar esa excepción específica, ya sea definida por el usuario o predefinida. Este formato se puede usar tanto en la ejecución como en el manejo de excepciones.
La captura de pantalla que aparece a continuación muestra RAISE seguido del nombre de una excepción para generar una excepción específica:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Explicación de sintaxis:
- En la sintaxis anterior, la palabra clave RAISE se usa en la parte de ejecución, seguida de la excepción 'exception_name'.
- Esto genera esa excepción en particular en tiempo de ejecución, y luego debe ser manejada o generada nuevamente.
Ejemplo 1: En este ejemplo veremos:
- Cómo declarar una excepción
- Cómo generar la excepción declarada
- Cómo propagarlo al bloque principal.
La captura de pantalla que aparece a continuación muestra el bloque completo que declara sample_exception, lo genera dentro de un bloque anidado y lo propaga al bloque principal:
La siguiente captura de pantalla muestra la continuación del mismo ejemplo, donde el bloque principal finalmente captura la excepción propagada:
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line('Inside nested block'); Dbms_output.put_line('Raising sample_exception from nested block'); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in nested block. Raising to main block'); RAISE; END; BEGIN Dbms_output.put_line('Inside main block'); Dbms_output.put_line('Calling nested block'); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in main block'); END; /
Code Explicación:
- Code línea 2: Declarar la variable 'sample_exception' como de tipo EXCEPTION.
- Code línea 3: Declarando el procedimiento nested_block.
- Code línea 6: Imprimiendo la instrucción “Dentro del bloque anidado”.
- Code línea 7: Imprimiendo el mensaje “Generando sample_exception desde bloque anidado”.
- Code línea 8: Generar la excepción usando 'RAISE sample_exception'.
- Code línea 10: Manejador de excepciones para la excepción sample_exception en el bloque anidado.
- Code línea 11: Imprimiendo el mensaje “Excepción capturada en el bloque anidado. Elevando al bloque principal”.
- Code línea 12: Generando la excepción en el bloque principal (propagándola).
- Code línea 15: Imprimiendo la instrucción “Dentro del bloque principal”.
- Code línea 16: Imprimiendo la declaración "Llamando al bloque anidado".
- Code línea 17: Llamando al procedimiento nested_block.
- Code línea 19: Manejador de excepciones para sample_exception en el bloque principal.
- Code línea 20: Imprimiendo el mensaje “Excepción capturada en el bloque principal”.
Puntos importantes a tener en cuenta en la excepción
- En una función, una excepción siempre debe devolver un valor o generar la excepción; de lo contrario, Oracle Genera un error de "La función devolvió un valor" en tiempo de ejecución.
- Estados de control de transacciones puede emitirse dentro del bloque de manejo de excepciones.
- SQLERRM y SQLCODE son funciones integradas que devuelven el mensaje de excepción y el código de excepción, respectivamente.
- Si no se gestiona una excepción, por defecto todas las transacciones activas en esa sesión se revierten.
- GENERAR_ERROR_DE_APLICACIÓN (- , ) se puede usar en lugar de RAISE para generar un error con un código y un mensaje personalizados. El código de error debe estar entre -20000 y -20999.





