You are on page 1of 19

Manejo de Excepciones en PL/SQL

Facultad Politécnica Base de Datos II 1


CONCEPTOS
Qué es una excepción?
 Es la identificación de un tipo de evento que
se levanta en SQL
Cómo se levanta la excepción?
 Cuando ocurre un error de Oracle.
 Levantando el error explícitamente.
Cómo se maneja el error?
 Atrapándolo con un manejador.
 Propagándolo al ambiente que se encuentra
por encima del PL/SQL que se ejecuta.
Facultad Politécnica Base de Datos II 2
Manejo de excepciones
Atrapar la excepción Propagar la excepción

(DECLARE) (DECLARE)

Se levanta BEGIN BEGIN


una
Se levanta la
excepción
excepción
EXCEPTION EXCEPTION
Se atrapa la La excepción
excepción no se previó
END; END;

La excepción se propaga al
ambiente desde el cual se llama

Facultad Politécnica Base de Datos II 3


TIPOS DE EXCEPCIONES
PROPIOS DEL ORACLE:

• PREDEFINIDOS (Servidor)
Se levantan de
forma implícita
• NO PREDEFINIDOS

Se levantan
• DEFINIDOS POR EL USUARIO explícitamente

Facultad Politécnica Base de Datos II 4


TIPOS DE EXCEPCIONES
EXCEPCIÓN DESCRIPCIÓN MANEJO

Errores de ORACLE Son unos 20 errores No necesita declarar estas


predefinidos que ocurren más excepciones. Son errores
frecuentemente en el predefinidos en el Servidor de
código PL/SQL Oracle y son levantados
implícitamente
Errores de ORACLE no Cualquier otro error Se pueden declarar en la sección
predefinidos estándar del servidor declarativa y el Servidor de Oracle
ORACLE los levanta implícitamente

Errores definidos por el El usuario determina Se deben declarar en la sección


usuario una condición como declarativa y se levantan
anormal explícitamente

Facultad Politécnica Base de Datos II 5


SINTAXIS
EXCEPTION
EXCEPTION
WHEN exception1 [OR
WHEN exception1 exception2 .. .. .]
[OR exception2 .] THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. ..
[WHEN exception3 [OR
[WHEN exception3 exception4 .. .. .]
[OR exception4 .] THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. .]
.]
[WHEN
[WHEN OTHERS
OTHERS THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. .]
.]

Facultad Politécnica Base de Datos II 6


GUÍA PARA TRATAMIENTO DE
EXCEPCIONES
 WHEN OTHERS debe ser la última cláusula.
 EXCEPTION : Con esta palabra se inicia el
tratamiento de excepción para un bloque
BEGIN-END
 Si una de las condiciones de excepción se
cumple, ya no se trata el resto

Facultad Politécnica Base de Datos II 7


Resumen de errores predefinidos
ERRORES PREDEFINIDOS EN ORACLE
MENSAJE NÚMERO
CURSOR_ALREADY_OPEN ORA-06511
DUP_VAL_ON_INDEX ORA-00001
INVALID_NUMBER ORA-01001
INVALID_CURSOR ORA-01722
LOGIN_DENIED ORA-01017
NO_DATA_FOUND ORA-01403
NOT_LOGGED_ON ORA-01012
PROGRAM_ERROR ORA-06501
ROWTYPE_MISMATCH ORA-06504
STORAGE_ERROR ORA-06500
TIMEOUT_ON_RESOURCE ORA-00051
TOO_MANY_ROWS ORA-01422
VALUE_ERROR ORA-06502
ZERO_DIVIDE ORA-01476
Ejemplos de excepciones predefinidas
CREATE
CREATE OROR REPLACE
REPLACE PROCEDURE
PROCEDURE elim_articulo
elim_articulo
(p_id_articulo
(p_id_articulo IN b_articulos.id%TYPE) IS
IN b_articulos.id%TYPE) IS
v_id
v_id b_articulos.id%TYPE;
b_articulos.id%TYPE;
BEGIN
BEGIN
/*
/* Verifico
Verifico antes
antes sisi no
no tengo
tengo registro
registro de
de ventas
ventas */
*/
BEGIN
BEGIN
SELECT
SELECT id_articulo
id_articulo INTOINTO v_id
v_id
FROM b_detalle_ventas
FROM b_detalle_ventas
WHERE
WHERE id_articulo
id_articulo == p_id_articulo
p_id_articulo
AND
AND ROWNUM
ROWNUM == 1;1;
EXCEPTION
EXCEPTION
WHEN
WHEN NO_DATA_FOUND
NO_DATA_FOUND THENTHEN
--
-- No existen ventas, por
No existen ventas, por lo
lo tanto
tanto puedo
puedo borrar
borrar --
--
DELETE FROM b_articulos
DELETE FROM b_articulos
WHERE
WHERE id id == p_id_articulo;
p_id_articulo;
COMMIT;
COMMIT;
END;
END;
EXCEPTION
EXCEPTION
WHEN
WHEN OTHERS
OTHERS THEN
THEN
ROLLBACK;
ROLLBACK;
DBMS_OUTPUT.PUT_LINE
DBMS_OUTPUT.PUT_LINE ('Error
('Error inesperado
inesperado ');
');
END
END elim_articulo;
elim_articulo;
Facultad Politécnica Base de Datos II 9
ERRORES NO PREDEFINIDOS

Declarar Asociar Referenciar

Sección Declarativa Sección de


manejo de errores

• Nombrar la • Codificar PRAGMA • Manejar la


excepción EXCEPTION_INIT excepción
levantada

Facultad Politécnica Base de Datos II 10


EJEMPLO DE ERRORES NO PREDEFINIDOS

Error ORA-02292 (restricción de integridad violada)


DECLARE
DECLARE
e_tiene_hijos
e_tiene_hijos EXCEPTION;
EXCEPTION; 1
PRAGMA
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT (e_tiene_hijos,
(e_tiene_hijos, -2292);
-2292);
BEGIN
BEGIN
2
DELETE
DELETE FROM
FROM b_articulos
b_articulos WHERE
WHERE id
id == &id;
&id;
COMMIT;
COMMIT;
EXCEPTION
EXCEPTION 3
WHEN
WHEN e_tiene_hijos
e_tiene_hijos THEN
THEN
DBMS_OUTPUT.PUT_LINE
DBMS_OUTPUT.PUT_LINE ('no
('no puede
puede borrar;
borrar; tiene
tiene
ítems
ítems que
que hace
hace referencia
referencia al
al artículo');
artículo');
END;
END;
//

Facultad Politécnica Base de Datos II 11


EXCEPCIONES PREDEFINIDAS POR EL
USUARIO

Declare Raise Reference

Sección Sección Sección de


Declarativa Ejecutable Manejo de Excepción

• Nombrar la • Levantar la • Manejar la


excepción excepción excepción
explícitamente con que se
RAISE levanta

Facultad Politécnica Base de Datos II 12


EJEMPLO DE EXCEPCIÓN DEFINIDA
POR EL USUARIO
DECLARE
DECLARE
v_id
v_id b_articulos.id%type
b_articulos.id%type := := &ID;
&ID;
e_tiene_hijos
e_tiene_hijos EXCEPTION;
EXCEPTION; 1
v_cant NUMBER;
v_cant NUMBER;
BEGIN
BEGIN
SELECT
SELECT COUNT(*)
COUNT(*) INTO
INTO v_cant
v_cant
FROM
FROM B_detalle_ventas
B_detalle_ventas
WHERE
WHERE id_articulo
id_articulo == v_id;
v_id;
--
-- Si
Si encuentra,
encuentra, es
es error
error --
--
IF NVL(v_cant,0) > 0 THEN
IF NVL(v_cant,0) > 0 THEN
RAISE 2
RAISE e_tiene_hijos;
e_tiene_hijos;
ELSE
ELSE
DELETE
DELETE FROM
FROM b_articulos
b_articulos WHERE
WHERE id
id == V_ID;
V_ID;
COMMIT;
COMMIT;
END
END IF;
IF;
EXCEPTION
EXCEPTION
WHEN
WHEN e_tiene_hijos
e_tiene_hijos THEN
THEN
DBMS_OUTPUT.PUT_LINE 3
DBMS_OUTPUT.PUT_LINE ('no('no puede
puede borrar;
borrar; tiene
tiene ítems
ítems
que
que hace
hace referencia
referencia alal artículo');
artículo');
END;
END;
Facultad Politécnica Base de Datos II 13
FUNCIONES PARA ATRAPAR
EXCEPCIONES

WHEN OTHERS
- Atrapa las excepciones por las que no se
preguntó
- Debe ser la última excepción manejada
SQLCODE
- Retorna el valor numérico del error
SQLERRM
- Retorna el mensaje asociado con el error

Facultad Politécnica Base de Datos II 14


EJEMPLO
.. .. ..
v_error_code
v_error_code NUMBER;
NUMBER;
v_error_message
v_error_message VARCHAR2(255);
VARCHAR2(255);
BEGIN
BEGIN
.. .. ..
EXCEPTION
EXCEPTION
.. .. ..
WHEN
WHEN OTHERS
OTHERS THEN
THEN
ROLLBACK;
ROLLBACK;
v_error_code
v_error_code :=:= SQLCODE;
SQLCODE;
v_error_message
v_error_message := := SQLERRM;
SQLERRM;
DBMS_OUTPUT.PUT_LINE
DBMS_OUTPUT.PUT_LINE
(TO_CHAR(v_error_code)||
(TO_CHAR(v_error_code)||
':
': '||
'|| v_error_message);
v_error_message);
END;
END;

Facultad Politécnica Base de Datos II 15


PROPAGACIÓN DE EXCEPCIONES

DECLARE
...
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (
e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP

Un bloque puede BEGIN


manejar el error o SELECT . . .
UPDATE . . .
pasarlo al siguiente IF SQL%NOTFOUND THEN
bloque RAISE e_no_rows;
END IF;
EXCEPTION
WHEN e_integrity THEN . . .
WHEN e_no_rows THEN . . .
END;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
END;

Facultad Politécnica Base de Datos II 16


CÓDIGOS DE ERROR DEFINIDOS POR EL
USUARIO

Oracle permite también definir números de


error y mensajes que son retornados a la
aplicación cliente, la que, una vez recibida,
puede manejar el error basado en el error
especificado por el usuario

Los errores especificados por el usuario pueden retornarse


usando:
RAISE_APPLICATION_ERROR(nro_error, ‘texto’);

Facultad Politécnica Base de Datos II 17


CÓDIGOS DE ERROR DEFINIDOS
POR EL USUARIO

 La cláusula RAISE termina la ejecución del


programa, deshace todos los efectos del
procedimiento y retorna un número de error
y un mensaje que especifica el usuario.
 El número de error debe manejarse en el
rango de –20000 a –20999, y el texto se
refiere a una expresión de tipo carácter.

Facultad Politécnica Base de Datos II 18


CÓDIGOS DE ERROR DEFINIDOS POR EL
USUARIO - Ejemplo

CREATE OR REPLACE FUNCTION F_RECUPERAR_EMP


(PCED NUMBER) RETURN VARCHAR2 IS
V_NOMBRE VARCHAR2(100);
BEGIN
SELECT NOMBRE||' '||APELLIDO INTO V_NOMBRE
FROM B_EMPLEADOS E
WHERE E.CEDULA = PCED;
RETURN V_NOMBRE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002, 'NO SE
ENCUENTRA EL EMPLEADO ');
END;
/

Facultad Politécnica Base de Datos II 19

You might also like