Anuncios en tutorial de programación PLSQL

miércoles, 4 de marzo de 2020

Gestión de errores en PL/SQL: generación de excepciones desde el código

En la mayoría de los casos, cuando una de nuestras aplicaciones PLSQL genera una excepción, es la base de datos Oracle la encargada de notificarlo automáticamente. Es decir, un programa PL/SQL reportará un error si durante la ejecución del mismo ocurre algún tipo de problema que la base de datos Oracle no puede manejar por si sola y nuestro código no tiene control sobre el mismo (ver artículo sobre el manejo de excepciones con PL/SQL).

RAISE_APPICATION_ERROR

Lo que muchos programadores desconocen es que PLSQL permite generar excepciones desde el propio código. ¿Por qué el código PL/SQL permite esto? Porque no todos los errores en una aplicación son debidos a fallos de procesamiento internos de la base de datos Oracle. También es posible que determinadas condiciones en los datos constituyan un error para nuestra aplicación, en cuyo caso necesitaremos parar nuestro programa y, con mucha probabilidad, notificar al usuario de que algo va mal.

PLSQL ofrece dos mecanismos para generar excepciones:

El comando SQL RAISE

Con el comando SQL RAISE es posible generar una excepción definida por nosotros mismos o también una excepción ya predefinida por la base de datos Oracle.

En el siguiente ejemplo podemos ver como cuando un usuario decide asignar un valor de NULL al parámetro num_empleado, el procedimiento PL/SQL genera la excepción estándar INVALID_NUMBER:

CREATE OR REPLACE PROCEDURE 
nombre_empleado (num_empleado in IN INTEGER) IS
BEGIN
  IF num_empleado IS NULL THEN
    RAISE INVALID_NUMBER;
  END IF;
END;

Por otro lado, conviene mencionar que el commando RAISE resulta especialmente útil para volver a genera una excepción dentro de una sección de manejo de excepciones.

El procedimiento estándar RAISE_APPLICATION_ERROR

El comando RAISE detiene la ejección del programa PL/SQL que lo genera y, a la vez, inicializa una serie de variables internas que permiten identificar el código de error correspondiente y el propio mensaje de error. Por ejemplo, el mensaje de error “ORA-01403 no data found” se trata de un error genérico que suministra la propia base da datos Oracle. Este error y otros errores son suficientes para que la base de datos Oracle pueda gestionarlos de forma adecuada. Pero que ocurre si nuestra aplicación genera errores del tipo “Número de empleado inválido” o “La dirección del empleado contiene errores”. En estos casos un error del tipo “ORA-01403 no data found” no va a ser de gran ayuda para que el usuario identifique que es lo que ha hecho mal y como puede arreglar el problema.

Para pasar desde una aplicación PLSQL un mensaje específico a los usuarios cuando ocurre algún error, lo que se hace es utilizar el procedimiento estándar PL/SQL RAISE_APPLICATION_ERROR. Este procedimiento acepta como parámetros un número entero (nuestro código de error), cuyo valor debe estar entre los valores -20.999 y -20.000, y una cadena de caracteres (nuestro mensaje de error).

Cuando se ejecuta este procedimiento desde un bloque de código PL/SQL, la ejecución del mismo se detiene inmediatamente generándose inmediatamente una excepción, cuyo código de error y mensaje son los pasados al procedimiento RAISE_APPLICATION_ERROR, de manera que si posteriormente llamamos a las funciones estándar SQLCODE y SQLERRM, éstas devolverán dichos valores.

A continuación os dejo un ejemplo de código PLSQL que utiliza dicho procedimiento:

CREATE OR REPLACE PROCEDURE
chequear_cod_postal (cod_postal IN VARCHAR2) IS
BEGIN
  IF (cod_postal < '01001' AND cod_postal > '52999') 
      OR LENGTH(cod_postal) != 5 
  THEN
    RAISE_APPLICATION_ERROR (-20100,
    'El CP debe estar entre lo valores 01001 y 52999');
  END IF;
END;

En el presente ejemplo se chequea que el código postal se encuentre entre los valores 01001 (Álava) y 52999 (Melilla) y que la longitud del mismo sea de cinco caracteres, mostrando al usuario el error “El CP debe estar entre lo valores 01001 y 52999” en caso de que no se cumpla alguna de estas dos condiciones.

0 comentarios: