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.
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:
Publicar un comentario