El manejo de excepciones en PL/SQL es una parte crucial para crear programas robustos y confiables. Las excepciones son eventos que interrumpen el flujo normal de ejecución de un programa. En PL/SQL, puedes manejar estas excepciones para que tu programa pueda recuperarse de errores y continuar ejecutándose.
Conceptos Clave
- Excepciones Predefinidas: PL/SQL proporciona un conjunto de excepciones predefinidas que cubren errores comunes.
- Excepciones Definidas por el Usuario: Puedes definir tus propias excepciones para manejar situaciones específicas de tu aplicación.
- Bloque EXCEPTION: Es una sección del bloque PL/SQL donde se manejan las excepciones.
Estructura del Bloque EXCEPTION
Un bloque PL/SQL puede tener una sección EXCEPTION opcional que sigue a la sección de ejecución. La estructura general es la siguiente:
DECLARE -- Declaración de variables y excepciones BEGIN -- Código ejecutable EXCEPTION -- Manejo de excepciones WHEN exception_name1 THEN -- Código para manejar exception_name1 WHEN exception_name2 THEN -- Código para manejar exception_name2 WHEN OTHERS THEN -- Código para manejar todas las demás excepciones END;
Ejemplo Práctico
Vamos a ver un ejemplo práctico que ilustra cómo manejar excepciones en PL/SQL.
Ejemplo: División por Cero
DECLARE num1 NUMBER := 10; num2 NUMBER := 0; result NUMBER; BEGIN result := num1 / num2; DBMS_OUTPUT.PUT_LINE('El resultado es: ' || result); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error: División por cero.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error desconocido.'); END;
Explicación del Código
- Declaración de Variables: Se declaran tres variables
num1
,num2
yresult
. - Sección BEGIN: Se intenta realizar una división por cero, lo que generará una excepción.
- Sección EXCEPTION:
WHEN ZERO_DIVIDE THEN
: Maneja específicamente la excepción de división por cero.WHEN OTHERS THEN
: Maneja cualquier otra excepción que no haya sido capturada por las cláusulas anteriores.
Excepciones Predefinidas
PL/SQL tiene varias excepciones predefinidas que puedes usar directamente. Aquí hay una tabla con algunas de las más comunes:
Excepción | Descripción |
---|---|
NO_DATA_FOUND |
No se encontró ningún dato. |
TOO_MANY_ROWS |
La consulta devolvió demasiadas filas. |
ZERO_DIVIDE |
Intento de dividir por cero. |
INVALID_CURSOR |
Operación no válida en un cursor. |
Definiendo Excepciones Personalizadas
Puedes definir tus propias excepciones utilizando la palabra clave EXCEPTION
en la sección DECLARE
.
Ejemplo: Excepción Personalizada
DECLARE e_custom EXCEPTION; num1 NUMBER := 10; num2 NUMBER := 0; result NUMBER; BEGIN IF num2 = 0 THEN RAISE e_custom; ELSE result := num1 / num2; END IF; EXCEPTION WHEN e_custom THEN DBMS_OUTPUT.PUT_LINE('Error: División por cero personalizada.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error desconocido.'); END;
Explicación del Código
- Declaración de Excepción Personalizada:
e_custom
se declara como una excepción personalizada. - Condición para Lanzar la Excepción: Se utiliza una condición
IF
para verificar sinum2
es cero y, en ese caso, se lanza la excepción personalizada usandoRAISE
. - Manejo de la Excepción Personalizada: En la sección
EXCEPTION
, se manejae_custom
y se imprime un mensaje específico.
Ejercicios Prácticos
Ejercicio 1: Manejo de Excepciones Predefinidas
Escribe un bloque PL/SQL que intente convertir una cadena a un número y maneje la excepción VALUE_ERROR
si la conversión falla.
DECLARE str VARCHAR2(10) := 'abc'; num NUMBER; BEGIN num := TO_NUMBER(str); DBMS_OUTPUT.PUT_LINE('El número es: ' || num); EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('Error: Conversión de valor fallida.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error desconocido.'); END;
Ejercicio 2: Excepciones Personalizadas
Define una excepción personalizada para manejar el caso en que una variable numérica sea negativa. Si la variable es negativa, lanza la excepción y maneja el error imprimiendo un mensaje adecuado.
DECLARE e_negative_number EXCEPTION; num NUMBER := -5; BEGIN IF num < 0 THEN RAISE e_negative_number; ELSE DBMS_OUTPUT.PUT_LINE('El número es positivo.'); END IF; EXCEPTION WHEN e_negative_number THEN DBMS_OUTPUT.PUT_LINE('Error: El número es negativo.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error desconocido.'); END;
Conclusión
El manejo de excepciones en PL/SQL es esencial para crear aplicaciones robustas y confiables. Al aprender a manejar tanto excepciones predefinidas como personalizadas, puedes asegurarte de que tu código pueda manejar errores de manera efectiva y continuar ejecutándose sin interrupciones. En el próximo módulo, exploraremos cómo trabajar con SQL dentro de PL/SQL, lo que te permitirá integrar consultas SQL directamente en tus bloques PL/SQL.
Curso de PL/SQL
Módulo 1: Introducción a PL/SQL
Módulo 2: Fundamentos de PL/SQL
- Estructura del Bloque PL/SQL
- Variables y Tipos de Datos
- Estructuras de Control
- Cursores
- Manejo de Excepciones