Anuncios en tutorial de programación PLSQL

viernes, 18 de diciembre de 2020

Manejo de excepciones en PL/SQL (excepciones definidas por el usuario)

Como continuación del anterior artículo dedicado al manejo de las excepciones PLSQL predefinidas, ahora voy a hablar de las excepciones definidas por el usuario.

Serpientes en PL/SQL

PLSQL permite al usuario definir sus propias excepciones. Estas excepciones deben ser declaradas y lanzadas explícitamente utilizando la sentencia RAISE. Este tipo de excepciones deben ser declaradas en el segmento DECLARE. Se declara una excepción como cualquier otra variable, asignandole el tipo EXCEPTION. Como las variables, una excepción declarada en un bloque es local a ese bloque y global a todos los sub-bloques que comprende.

También existe un procedimiento estándar de PL/SQL que permite lanzar errores y definir y enviar un mensaje de error. Su formato es el siguiente:

   RAISE_APPLICATION_ERROR (número de error, mensaje de error);

Cuando desde un programa se realiza una llamada a este procedimiento, se lanza una excepción y se deshacen todos los cambios realizados por el programa sobre la base de datos Oracle.

Ejemplo:

   DECLARE
     vprecio inventario.precio%TYPE;
     barato EXCEPTION;
   BEGIN
     [Otras sentencias]
     BEGIN
       SELECT precio FROM inventario
       WHERE articulo = 'tvplasma'
       INTO vprecio;
       IF vprecio < 100 THEN
         RAISE barato;
       END IF;
       EXCEPTION
       WHEN NO_DATA_FOUND THEN
         RAISE_APPLICATION_ERROR (-20001, 'Sin TV de plasma');
       WHEN TOO_MANY_ROWS THEN
         RAISE_APPLICATION_ERROR (-20002, 'Muchas TV de plasma');
       WHEN barato THEN
         DBMS_OUTPUT.PUT_LINE("El articulo es muy barato.");
         UPDATE inventario
         SET precio = precio + 100
         WHERE articulo = 'tvplasma';
         DBMS_OUTPUT.PUT_LINE("Precio subido 100 euros");
       WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE("Error, abortando ejecución.");
         RAISE;
     END;

     [Otras sentencias]

   END;

En este ejemplo si la sentencia SELECT INTO fallase por no devolver ningún registro (NO_DATA_FOUND) o por devolver más de uno (TOO_MANY_ROWS), se lanzaría un error con los mensajes especificados en el procedimiento RAISE_APPLICATION_ERROR deteniéndose la ejecución del programa. Si el precio del artículo buscado (tvplasma) fuera menor de 100 euros, entonces se actualizaría el precio del artículo sumándo 100 euros al precio original y la ejecución del programa continuaría. Para cualquier otro error, se mandaría un mensaje de error a la pantalla y la ejecución del programa se abortaría.

0 comentarios: