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

  1. Excepciones Predefinidas: PL/SQL proporciona un conjunto de excepciones predefinidas que cubren errores comunes.
  2. Excepciones Definidas por el Usuario: Puedes definir tus propias excepciones para manejar situaciones específicas de tu aplicación.
  3. 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

  1. Declaración de Variables: Se declaran tres variables num1, num2 y result.
  2. Sección BEGIN: Se intenta realizar una división por cero, lo que generará una excepción.
  3. 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

  1. Declaración de Excepción Personalizada: e_custom se declara como una excepción personalizada.
  2. Condición para Lanzar la Excepción: Se utiliza una condición IF para verificar si num2 es cero y, en ese caso, se lanza la excepción personalizada usando RAISE.
  3. Manejo de la Excepción Personalizada: En la sección EXCEPTION, se maneja e_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.

© Copyright 2024. Todos los derechos reservados