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,num2yresult. - 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_customse declara como una excepción personalizada. - Condición para Lanzar la Excepción: Se utiliza una condición
IFpara verificar sinum2es 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_customy 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
