Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Objetivos
8-2 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Objetivos
Ha aprendido a escribir bloques PL/SQL con una seccin de declaraciones y una seccin ejecutable.
Todos los cdigos SQL y PL/SQL que se tienen que ejecutar estn escritos en el bloque ejecutable.
Hasta ahora se ha asumido que el cdigo funciona bien si presta atencin a los errores de tiempo de
compilacin. Sin embargo, puede que el cdigo provoque algunos errores inesperados en tiempo de
ejecucin. En esta leccin, aprender a tratar estos errores en el bloque PL/SQL.
8-3 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8-4 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Qu Es una Excepcin?
Considere el ejemplo que se muestra en la diapositiva. No hay errores de sintaxis en el cdigo, lo que
significa que puede ejecutar correctamente el bloque annimo. La sentencia SELECT del bloque
recupera el apellido de John.
Sin embargo, aparecer el siguiente informe de error al ejecutar el cdigo:
El cdigo no funciona como se esperaba. Se esperaba que la sentencia SELECT recuperara slo una
fila; sin embargo, recupera varias filas. Estos errores que se producen en tiempo de ejecucin se
denominan excepciones. Cuando se produce una excepcin, el bloque PL/SQL se termina. Puede
manejar estas excepciones en el bloque PL/SQL.
8-5 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8-6 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Se ha
detectado la Terminar
excepcin? No repentinamente.
Terminar
correctamente.
8-7 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Manejo de Excepciones
Deteccin de una Excepcin
Incluya una seccin EXCEPTION en el programa PL/SQL para detectar excepciones. Si la excepcin
se emite en la seccin ejecutable del bloque, el procesamiento se diversifica en el manejador de
excepciones correspondiente de la seccin de excepciones del bloque. Si PL/SQL maneja de forma
correcta la excepcin, no se propaga al bloque delimitador o al entorno de llamada. El bloque
PL/SQL termina de forma correcta.
Propagacin de una Excepcin
Si la excepcin se emite en la seccin ejecutable del bloque y no hay ningn manejador de
excepciones correspondiente, el bloque PL/SQL termina con fallos y la excepcin se propaga a un
bloque delimitador o al entorno de llamada. El entorno de llamada puede ser cualquier aplicacin
(como SQL*Plus, que llama al programa PL/SQL).
Predefinida de Oracle Server
No predefinida de Oracle Server } Se emite implcitamente
8-8 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Tipos de Excepcin
Hay tres tipos de excepciones.
Excepcin Descripcin Instrucciones para el manejo
Error predefinido Uno de los No es necesario que declare estas
del servidor de aproximadamente 20 excepciones. Estn predefinidas por
Oracle errores que se producen el servidor de Oracle y se producen
con ms frecuencia en implcitamente.
cdigo PL/SQL
Error no Cualquier otro error Debe declararlos en la seccin de
predefinido del estndar del servidor de declaraciones; el servidor de Oracle
servidor de Oracle Oracle lo produce implcitamente y puede
capturar el error en el manejador de
excepciones.
Error definido por Condicin que el Debe declararlos en la seccin de
el usuario desarrollador determina declaraciones y producirlos
que es anormal explcitamente.
Nota: algunas herramientas de la aplicacin con PL/SQL del cliente (como Oracle Developer Forms)
tienen sus propias excepciones.
8-9 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
8 - 10 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 12 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 13 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 16 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 17 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 18 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
DECLARE
error_code NUMBER;
error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
error_code := SQLCODE ;
error_message := SQLERRM ;
INSERT INTO errors (e_user, e_date, error_code,
error_message) VALUES(USER,SYSDATE,error_code,
error_message);
END;
/
8 - 19 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 20 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 21 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
DECLARE
. . .
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
Los subbloques SELECT ...
pueden manejar una UPDATE ...
excepcin o IF SQL%NOTFOUND THEN
transferirla al bloque RAISE e_no_rows;
END IF;
delimitador.
END;
END LOOP;
EXCEPTION
WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
/
8 - 22 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Sintaxis:
raise_application_error (error_number,
message[, {TRUE | FALSE}]);
8 - 23 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Procedimiento RAISE_APPLICATION_ERROR
Utilice el procedimiento RAISE_APPLICATION_ERROR para comunicar una excepcin
predefinida de forma interactiva al devolver un cdigo de error no estndar y un mensaje de error.
Con RAISE_APPLICATION_ERROR, puede informar de los errores de la aplicacin y evitar la
devolucin de excepciones no tratadas.
En la sintaxis:
error_number Es un nmero especificado por el usuario para la excepcin entre
-20.000 y -20.999
message Es el mensaje especificado por el usuario para la excepcin; es una
cadena de caracteres de hasta 2.048 bytes
TRUE | FALSE Es un parmetro booleano opcional (si est definido en TRUE, el
error se coloca en la pila de errores anteriores. Si est definido en
FALSE, que es el valor por defecto, el error sustituye a todos los
errores anteriores.)
8 - 24 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Seccin ejecutable:
BEGIN
...
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,
'This is not a valid manager');
END IF;
...
Seccin de excepciones:
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,
'Manager is not a valid employee.');
END;
/
8 - 25 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
8 - 26 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Respuesta: a
Puede detectar cualquier error incluido un manejador correspondiente dentro de la seccin de manejo
de excepciones del bloque PL/SQL. Cada manejador est formado por una clusula WHEN, que
especifica un nombre de excepcin, seguido de una secuencia de sentencias que se ejecutan cuando
se emite dicha excepcin. Puede incluir cualquier nmero de manejadores dentro de una seccin
EXCEPTION para manejar excepciones especficas. Sin embargo, no puede tener varios manejadores
para una nica excepcin.
8 - 27 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.
Resumen
En esta leccin, ha aprendido a tratar diferentes tipos de excepciones. En PL/SQL, una condicin de
advertencia o error en tiempo de ejecucin se denomina excepcin. Las excepciones predefinidas son
condiciones de error que define Oracle Server. Las excepciones no predefinidas pueden ser cualquier
error de Oracle Server estndar. Las excepciones definidas por el usuario son excepciones especficas
de la aplicacin. La funcin PRAGMA EXCEPTION_INIT se puede utilizar para asociar un nombre
de excepcin declarada a un error de Oracle Server.
Puede definir sus propias excepciones en la seccin de declaraciones de cualquier bloque PL/SQL.
Por ejemplo, puede definir una excepcin denominada INSUFFICIENT_FUNDS para marcar
cuentas bancarias al descubierto.
Cuando se produce un error, se emite una excepcin. La ejecucin normal se para y el control se
transfiere a la seccin de manejo de excepciones del bloque PL/SQL. Las excepciones internas se
emiten de forma implcita (automticamente) por el sistema de tiempo de ejecucin; sin embargo, las
excepciones definidas por el usuario se deben emitir explcitamente. Para manejar las excepciones
generadas, escriba rutinas independientes denominadas manejadores de excepciones.
8 - 28 Copyright 2010, Oracle y/o sus filiales. Todos los derechos reservados.