Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
www.facebook.com/sise.universitaria
EXCEPCIONES EN
PL/SQL
NO_DATA_FOUND
CURSOR_ALREADY_OPEN
(Ej: Abrir un cursor que ya estaba
abierto)
INVALID_NUMBER
(Ej: Fallo de conversin,
k3b no es un nmero)
VALUE_ERROR
(Ej: Error de truncamiento)
ZERO_DIVIDE
DUP_VAL_ON_INDEX
Sea la tabla:
DROP TABLE emp;
CREATE TABLE emp(
cod NUMBER(8) PRIMARY KEY,
nom VARCHAR2(15),
depto NUMBER(3)
);
INSERT INTO emp VALUES(12,'Mara',10);
INSERT INTO emp VALUES(15,'Ana',5);
INSERT INTO emp VALUES(76,'Lisa',15);
DECLARE
nro_emp emp.cod%TYPE;
BEGIN
SELECT cod INTO nro_emp
FROM emp
WHERE nom = 'Mara';
DBMS_OUTPUT.PUT_LINE('El cdigo de Mara es: ' ||
nro_emp);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Mara no existe');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Hay varias Maras');
END;
/
DECLARE
cod_apta apuesta.cod%TYPE; nro_ale apuesta.cant%TYPE;
BEGIN
FOR i IN 1..20 LOOP
S BEGIN
cod_apta := ABS(MOD(DBMS_RANDOM.RANDOM,10));
u
b
nro_ale := ABS(MOD(DBMS_RANDOM.RANDOM,10));
b
INSERT INTO apuesta VALUES(cod_apta, nro_ale);
l
EXCEPTION
o
WHEN DUP_VAL_ON_INDEX THEN
q
UPDATE apuesta SET cant = cant + nro_ale
u
WHERE cod = cod_apta;
e
END;
END LOOP;
END;
/
DECLARE
nro_emps NUMBER;
muy_pocos EXCEPTION;
BEGIN
SELECT COUNT(*) INTO nro_emps
FROM emp;
IF nro_emps < 4 THEN
RAISE muy_pocos;
END IF;
DBMS_OUTPUT.PUT_LINE('Hay suficientes empleados: ' || nro_emps);
EXCEPTION
WHEN muy_pocos THEN
DBMS_OUTPUT.PUT_LINE('Muy pocos empleados');
END;
/
EL MANEJO DE OTHERS
Es una excepcin predefinida que sirve
para capturar una excepcin que no ha
sido tratada en el manejador de
excepciones
Se puede obtener el mensaje del error que
ocurri mediante la funcin SQLERRM
Para el control de excepciones, como
mnimo se debera usar OTHERS en todo
programa PL/SQL
OTHERS se debe escribir de ltima en el
manejador de excepciones
Nota. El siguiente ejemplo requiere el permiso:
GRANT EXECUTE ON SYS.DBMS_LOCK TO usuario;
DECLARE
CURSOR emp_c IS SELECT * FROM emp FOR UPDATE
NOWAIT;
BEGIN
LOOP
BEGIN
OPEN emp_c; --Intenta bloquear
DBMS_OUTPUT.PUT_LINE('OK!');
EXIT; --Sale del ciclo
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Tabla ocupada '||
SQLERRM);
DBMS_LOCK.SLEEP(5); --Esperar 5 seg
END;
END LOOP;
COMMIT;
END;
/
EXCEPTION_INIT
No todos los errores de Oracle tienen un
nombre de excepcin definido.
Es posible asociar una excepcin
de usuario con un error de Oracle as:
En el siguiente ejemplo, el error:
ORA-01400: cannot insert NULL into ()
Queda asociado con la excepcin llamada
es_nulo:
EXCEPTION_INIT
CREATE TABLE t(a NUMBER(2) NOT NULL);
DECLARE
es_nulo EXCEPTION;
PRAGMA EXCEPTION_INIT(es_nulo,-1400);
BEGIN
INSERT INTO t VALUES(NULL);
EXCEPTION
WHEN es_nulo THEN
DBMS_OUTPUT.PUT_LINE('Nulo:'||SQLCODE||' '||SQLERRM);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||' '||SQLERRM);
END;
/
PROPAGACIN DE LAS
EXCEPCIONES
Caso 1:
DECLARE
a EXCEPTION;
BEGIN
BEGIN
RAISE a;
EXCEPTION
WHEN a THEN
...
END;
END;
-- Se dispara la excepcin a
-- Se trata la excepcin aqu
Caso 2:
DECLARE
a EXCEPTION;
b EXCEPTION;
BEGIN
BEGIN
RAISE b;
EXCEPTION
WHEN a THEN
END;
EXCEPTION
WHEN b THEN
END;
-- No se trat b aqu
Caso 3:
DECLARE
a EXCEPTION; b EXCEPTION;
c EXCEPTION;
BEGIN
BEGIN
RAISE c;
EXCEPTION
WHEN a THEN
END;
EXCEPTION
WHEN b THEN
END;
-- No se trat c aqu
DECLARE
val NUMBER(5) := 'hola';
BEGIN
EXCEPTION
WHEN OTHERS THEN
-- No la captura
END;
-- Aborta
DECLARE
x NUMBER(5):= 'Hola';
BEGIN
EXCEPTION
WHEN OTHERS THEN
END;
EXCEPTION
WHEN OTHERS THEN
END;
-- No la captura
-- Se trata aqu
DECLARE
a EXCEPTION;
b EXCEPTION;
BEGIN
RAISE a;
EXCEPTION
WHEN a THEN
RAISE b;
WHEN b THEN
END;
-- a se trata aqu
-- No captura a b
-- Aborta
BEGIN
RAISE a;
EXCEPTION
WHEN a THEN
RAISE b;
WHEN b THEN
END;
EXCEPTION
WHEN b THEN
END;
-- a se trata aqu
-- No captura a b
-- b se trata aqu
DECLARE
a EXCEPTION;
BEGIN
RAISE a;
EXCEPTION
WHEN OTHERS THEN
END;
-- a se captura aqu
Bibliografia:
Francisco Moreno
Universidad Nacional