You are on page 1of 12

Leccin 8- Manejo de excepciones Objetivos

1. 2. 3. 4. 5. 6.

Definir PL / SQL excepciones Reconocer las excepciones no controladas Enumerar y utilizar diferentes tipos de controladores de excepciones PL / SQL Trampa de errores no previstos Describir el efecto de propagacin de excepciones en bloques anidados Personalizar los mensajes de excepcin PL / SQL

Ha aprendido a escribir bloques PL / SQL con una seccin declarativa y una seccin ejecutable. Todo el cdigo SQL y PL / SQL que debe ejecutarse se escribe en el bloque ejecutable. Hasta ahora se ha supuesto que el cdigo funciona satisfactoriamente si usted toma el cuidado de los errores en tiempo de compilacin. Sin embargo, el cdigo puede causar algunos errores inesperados en tiempo de ejecucin. En esta leccin, aprender cmo hacer frente a este tipo de errores en el bloque PL / SQL. Ejemplo de una excepcin Considere el ejemplo mostrado en la diapositiva. No hay errores de sintaxis en el cdigo, lo que significa que debe ser capaz de ejecutar con xito el bloque annimo. La instruccin SELECT en el bloque recupera el apellido de John.

Usted ver el siguiente resultado cuando se ejecuta el cdigo:

El cdigo no funciona como se esperaba. Esperabas la instruccin SELECT para recuperar slo una fila, sin embargo, recupera varias filas. Tales errores que se producen en tiempo de ejecucin se llaman excepciones. Cuando se produce una excepcin, el bloque PL / SQL se termina. Usted puede manejar este tipo de excepciones en su bloque PL / SQL. Usted ha escrito bloques PL / SQL con una seccin declarativa (que comienza con la palabra clave DECLARE) y una seccin ejecutable (comenzando y terminando con las palabras clave BEGIN y END, respectivamente). Para el manejo de excepciones, se incluye otra seccin opcional llamado la seccin excepcin. Esta seccin comienza con la palabra clave EXCEPTION.

Si est presente, se trata de la ltima seccin de un bloque PL / SQL. Examine la seccin excepcin del cdigo en la diapositiva. Usted no tiene que prestar atencin a la sintaxis y los estados, usted aprender acerca de ellos ms adelante en la leccin. El cdigo en la diapositiva anterior se reescribe para manejar la excepcin que se produjo.

La salida del cdigo es:

A diferencia de antes, el programa PL / SQL no termina abruptamente. Cuando se produce la excepcin, se ejecutan los cambios de control a la seccin excepcin y todas las declaraciones contenidas en la seccin excepcin. El bloque PL / SQL termina con la finalizacin normal, exitosa. Manejo de Excepciones con PL / SQL Una excepcin es un error en PL / SQL que se genera durante la ejecucin de un bloque. Un bloque siempre termina cuando PL / SQL produce una excepcin, pero se puede especificar un manejador de excepciones para realizar acciones finales antes de que termine el bloque. Dos mtodos para lanzar una excepcin Un error de Oracle se produce y la excepcin asociada se eleva automticamente. Por ejemplo, si se produce el error ORA- 01403 cuando no hay filas que recuperar de la base de datos en una instruccin SELECT, PL / SQL plantea la excepcin NO_DATA_FOUND. Estos errores se convierten en excepciones predefinidas. Dependiendo de la funcionalidad empresarial de sus implementos de programa, puede que tenga que elevar explcitamente una excepcin. Usted plantea una excepcin explcita mediante la emisin de la sentencia raise en el bloque. La excepcin planteada puede ser definido por el usuario o predefinidos. Tambin hay algunos errores de Oracle no predefinidos. Estos errores son los errores estndar de Oracle que no estn predefinidas. Puede declarar explcitamente excepciones y asociarlos con los errores de Oracle no predefinidos. Manejo de excepciones La captura de una excepcin Incluya una seccin excepcin en su programa de PL / SQL para atrapar excepciones. Si la excepcin se plantea en la seccin ejecutable del bloque, el procesamiento y luego las ramas

para el controlador de excepciones correspondiente en la seccin excepcin del bloque. Si PL / SQL maneja con xito la excepcin, la excepcin no se propaga al bloque que lo contiene o al entorno de la llamada. El bloque PL / SQL termina con xito. La propagacin de una excepcin Si la excepcin se plantea en la seccin ejecutable del bloque y no existe un controlador de excepciones correspondiente, entonces el bloque PL / SQL termina en el fracaso y la excepcin se propaga a un bloque de inclusin o para el entorno de la llamada. El entorno de la llamada puede ser cualquier aplicacin (como SQL * Plus que invoca el programa PL / SQL).

Hay tres tipos de excepciones. Predefinidas, Errores del servidor Oracle Una de aproximadamente 20 errores que se producen con ms frecuencia en PL / SQL de cdigo. Usted no necesita declarar estas excepciones. Ellos estn predefinidos por el servidor de Oracle y se disparadas de forma implcita. No predefinido, Errores del servidor Oracle Cualquier otro error estndar de Oracle Server. Es necesario declarar stos dentro de la parte declarativa, el servidor de Oracle aumentar el error de forma implcita, y puedes coger por el error en el controlador de excepciones. Error definido por el usuario Una condicin que es determinada por el desarrollador como anormal. Declare en la parte declarativa y maneje de forma explcita. Nota: Algunas herramientas de aplicacin con el lado del cliente PL / SQL (como Oracle Forms Developer) tienen sus propias excepciones. Captura Excepciones Puede interceptar cualquier error al incluir un controlador correspondiente dentro de la seccin de control de excepciones del bloque PL / SQL. Cada controlador consiste en una clusula WHEN, que especifica un nombre de excepcin, seguido por una secuencia de sentencias que se ejecutan cuando se produce esta excepcin. Puede incluir cualquier nmero de manejadores dentro de una seccin de excepciones para controlar excepciones especficas. Sin embargo, no se puede tener varios controladores para una sola excepcin. En la sintaxis:

exception

Es el nombre estndar de una excepcin predefinida o el nombre de una excepcin definida por el usuario declarado dentro de la seccin declarativa statement Es uno o ms declaraciones PL / SQL o SQL

OTHERS

Es una clusula de excepcin de manipulacin opcional que atrapa las excepciones que no han sido manipulados de forma explcita

Manejador de excepciones WHEN OTHERS La seccin de captura de excepciones controla slo las excepciones que se especifican, cualquier otra excepcin que no se encuentre controlada a menos utilizara el manejador de excepciones OTHERS. Esto atrapa cualquier excepcin todava no se maneje. Por esta razn, OTHERS puede ser utilizado, y si se utiliza debe ser el ltimo controlador de excepciones que se define . WHEN NO_DATA_FOUND THEN statement1; ... WHEN TOO_MANY_ROWS THEN statement1; ... WHEN OTHERS THEN statement1; Considere el ejemplo anterior. Si la excepcin NO_DATA_FOUND se dispara por el programa, Se ejecutan las instrucciones en el controlador correspondiente. Si se produce la excepcin TOO_MANY_ROWS , se ejecutan las instrucciones en el controlador correspondiente. Sin embargo, si se plantea alguna otra excepcin, se ejecutan las instrucciones en el controlador de excepciones OTHERS. La excepcin OTHERS captura todas las excepciones que no estn atrapados . Algunas herramientas de Oracle tienen sus propias excepciones predefinidas que se pueden plantear cuando se disparan eventos en la aplicacin. El manejador OTHERS tambin captura estas excepciones. Directrices para la captura de excepciones Comience la seccin de control de excepciones del bloque con la palabra clave EXCEPTION. Definir varios controladores de excepciones, cada uno con su propio conjunto de acciones, para el bloque.

Cuando se produce una excepcin, PL / SQL procesa slo un controlador antes de abandonar el bloque. Coloque la clusula OTHERS despus de todas las dems clusulas de control de excepciones. Usted puede tener slo una clusula OTHERS. Las excepciones no pueden aparecer en instrucciones de asignacin o sentencias de SQL. Capturar errores predefinidos Oracle Server Capturar a un error predefinido servidor Oracle haciendo referencia a su nombre predefinido dentro de la rutina de control de excepciones correspondiente. Para obtener una lista completa de las excepciones predefinidas, consulte la Gua de PL / SQL de gua y referencia. Nota: PL / SQL se declara excepciones predefinidas en el paquete estndar. Haga referencia al nombre predefinido en la rutina de control de excepciones. Ejemplos de excepciones predefinidas: NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX
Exception Name Oracle Server Error Number Description

ACCESS_INTO_NULL

ORA-06530

Se intent asignar valores a los atributos de un objeto no inicializado Ninguna de las opciones en el cuando se seleccionan clusulas de una instruccin CASE, y no hay ninguna clusula ELSE. Intento de aplicar mtodos de recoleccin de otros que la que existe en una tabla anidada sin inicializar o VARRAY Se ha intentado abrir un cursor ya est abierto Intento de insertar un valor duplicado Se produjo la operacin del cursor ilegal. La conversin de la cadena de caracteres a un nmero falla. Inicio de sesin en el servidor de Oracle con un nombre de usuario o contrasea no vlidos Hilera SELECT devuelve ningn dato. Programa PL/SQL emite una llamada de base de datos sin estar conectado al servidor de Oracle. PL / SQL tiene un problema interno. Variable host de cursor y variable de cursor PL / SQL que participan en una misin, tienen tipos de retorno incompatibles.

CASE_NOT_FOUND

ORA-06592

COLLECTION_IS_NULL

ORA-06531

CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON

ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01017 ORA-01403 ORA-01012

PROGRAM_ERROR ROWTYPE_MISMATCH

ORA-06501 ORA-06504

Exception Name

Oracle Server Error Number ORA06500 ORA06533 ORA06532 ORA01410 ORA00051 ORA01422 ORA06502 ORA01476

Description

STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT

PL / SQL se qued sin memoria o la memoria est daada. Se hace referencia una tabla anidada o elemento VARRAY mediante el uso de un nmero de ndice mayor que el nmero de elementos de la coleccin Referencia una tabla anidada o elemento VARRAY utilizando un nmero de ndice que est fuera del rango legal (por ejemplo, -1) La conversin de una cadena de caracteres en un ROWID universales falla porque la cadena de caracteres no representa un ROWID vlida. Tiempo de espera al servidor Oracle estaba esperando a un recurso. Una hilera SELECT devuelve ms de una fila. Aritmtica, la conversin, el truncamiento o error de tamao en restricciones. Se ha intentado dividir por cero

SUBSCRIPT_OUTSIDE_LIMIT

SYS_INVALID_ROWID TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE

Atrapar errores no predefinidas Oracle Server Excepciones no predefinidas son similares a las excepciones predefinidas, sin embargo, no se definen como excepciones PL / SQL en el servidor Oracle. Ellos son los errores estndar de Oracle. Puede crear excepciones con errores estndar de Oracle mediante el uso de la funcin de PRAGMA EXCEPTION_INIT. Tales excepciones se llaman excepciones no predefinidos. Puede interceptar un error del servidor Oracle no predefinido declarndolo primero. La excepcin declarada se eleva de manera implcita. En PL / SQL, PRAGMA EXCEPTION_INIT indica al compilador para asociar un nombre de excepcin con un nmero de error de Oracle. Esto permite hacer referencia a cualquier excepcin interna por su nombre y escribir un controlador especfico para ello. Nota: PRAGMA (tambin llamado pseudoinstructions) es la palabra clave que significa que la declaracin es una directiva del compilador, que no se procesa cuando se ejecuta el bloque PL / SQL. Ms bien, se dirige al compilador PL / SQL para interpretar todas las apariciones del nombre de la excepcin dentro del bloque como el nmero de errores del servidor Oracle asociado.

Error no predefinidos 1. Declarar el nombre de la excepcin en la seccin declarativa. Sintaxis: exception EXCEPTION; En la sintaxis, excepcin es el nombre de la excepcin. 2. Asociar la excepcin declarado con el nmero de errores del servidor Oracle estndar utilizando la funcin PRAGMA EXCEPTION_INIT. Sintaxis: PRAGMA EXCEPTION_INIT(exception, error_number); En la sintaxis, la excepcin es la excepcin declarado con anterioridad y error_number es un nmero de errores del servidor Oracle estndar. 3. Hacer referencia a la excepcin declarados dentro de la rutina de excepciones de manejo correspondiente. Ejemplo

El ejemplo de la imagen intenta insertar el valor NULL en la columna de la department_name de la tabla departamentos. Sin embargo, la operacin no tiene xito porque department_name es una columna NOT NULL. Tenga en cuenta la siguiente lnea en el Ejemplo: DBMS_OUTPUT.PUT_LINE(SQLERRM); Funciones para Atrapar Excepciones Cuando se produce una excepcin, se puede identificar el cdigo de error asociado o mensaje de error mediante el uso de dos funciones. Sobre la base de los valores del cdigo o el mensaje, usted puede decidir qu acciones posteriores a tomar. SQLCODE devuelve el nmero de error de Oracle para las excepciones internas. SQLERRM devuelve el mensaje asociado con el nmero de error. SQLCODE Devuelve el valor numrico para el cdigo de error (Se puede asignar a una variable numrica.) SQLERRM Devuelve datos de caracteres que contiene el mensaje asociado con el nmero de error Valores SQLCODE : Ejemplos 0 1 +100 Ninguna excepcin encontrado Excepcin definida por el usuario Excepcin NO_DATA_FOUND

negative number Otro nmero de errores del servidor Oracle

Cuando una excepcin se encuentra atrapado en el controlador de excepciones WHEN OTHERS, puede utilizar un conjunto de funciones genricas para identificar los errores. El ejemplo de la diapositiva muestra los valores de SQLCODE y SQLERRM asignado a las variables, y entonces esas variables que se utiliza en una instruccin SQL. No se puede utilizar SQLCODE o SQLERRM directamente en una sentencia SQL. En su lugar, debe asignar los valores a las variables locales y luego usar las variables en la instruccin SQL, como se muestra en el siguiente ejemplo:

Capturar excepciones definidas por el usuario PL / SQL permite definir sus propias excepciones en funcin de los requisitos de su aplicacin. Por ejemplo, usted puede pedir al usuario que introduzca un nmero de departamento. Defina una excepcin para hacer frente a las condiciones de error en los datos de entrada. Compruebe si existe el nmero de departamento. Si no es as, entonces es posible que tenga que aumentar la excepcin definida por el usuario. PL / SQL excepciones deben ser: Declarado en la seccin declarativa de un bloque PL / SQL Criado explcitamente con las declaraciones RAISE Manej en la seccin EXCEPTION

Usted captura una excepcin definida por el usuario mediante la declaracin del mismo, constituyendo de forma explcita. 1. Declarar el nombre de la excepcin definida por el usuario dentro de la seccin declarativa . Sintaxis: exception EXCEPTION; En la sintaxis , excepcin es el nombre de la excepcin . 2. Utilice la instruccin RAISE para elevar la excepcin explcita dentro de la seccin ejecutable. Sintaxis: RAISE exception; En la sintaxis , la excepcin es la excepcin declarado previamente . 3. Hacer referencia a la excepcin declarados dentro de la rutina de excepciones de manejo correspondiente. Ejemplo Este bloque se actualiza la department_name de un departamento. El usuario proporciona el nmero de departamento. Y el nuevo nombre . Si el nmero de departamento suministrado no Existe, no hay filas que se actualicen en la tabla de departamentos. Dispare una excepcin e imprimir un mensaje para el usuario que se ha introducido un nmero de departamento no vlido.

Nota: Utilice la instruccin RAISE por s mismo dentro de un manejador de excepciones para elevar la misma excepcin de nuevo y se propague de nuevo al entorno de la llamada. La propagacin de excepciones en una Secuencia auxiliar Cuando un sub-bloque controla una excepcin, que termina normalmente. E l control se reanuda en el bloque de inclusin inmediatamente despus de la declaracin END del subbloque. Sin embargo, si un PL / SQL produce una excepcin y el bloque actual no tiene un controlador para esta excepcin, la excepcin se propaga a los bloques de cerramiento sucesivas hasta que encuentra un controlador. Si ninguno de estos bloques de maneja la excepcin, se produce una excepcin no controlada en los resultados de entorno host. Cuando la excepcin se propaga a un bloque de inclusin, se pasan por alto las acciones ejecutables restantes en ese bloque. Una ventaja de este comportamiento es que se puede incluir declaraciones que requieren su

propio error exclusivo manejo de su propio bloque, dejando el manejo ms general excepcin al bloque que lo contiene. Tenga en cuenta que en el ejemplo de que las excepciones ( no_rows e integridad ) se declaran en el bloque externo . En el bloque interno, cuando se produce la excepcin no_rows , PL / SQL se parece a la excepcin que se maneja en el sub-bloque . Debido a que la excepcin no se controla en el sub-bloque, la excepcin se propaga al bloque de afuera, donde PL / SQL encuentra el controlador.

Procedimiento RAISE_APPLICATION_ERROR Utilice el procedimiento RAISE_APPLICATION_ERROR para comunicar una excepcin predefinida interactiva devolviendo un cdigo de error no estndar y el mensaje de error. Con RAISE_APPLICATION_ERROR, puede informar de errores en su aplicacin y evitar volver excepciones no controladas.

error_number
20000 y -20,999

Es un nmero especificado por el usuario para la excepcin entre -

message

Es el mensaje especificado por el usuario para la excepcin; es una cadena de caracteres de hasta 2048 bytes de longitud TRUE | FALSE Es un parmetro booleano opcional (Si es TRUE, se coloca el error en la pila de errores anteriores. Si es falso, que es el valor por defecto, el error sustituye a todos los errores anteriores.) El procedimiento RAISE_APPLICATION_ERROR puede ser utilizado tanto en la seccin ejecutable o la seccin excepcin de un programa de PL / SQL, o ambos. El error devuelto es coherente con la forma en que el servidor Oracle produce un error predefinido, no predefinida o definida por el usuario. El nmero de error y el mensaje se muestra al usuario.

La diapositiva muestra que el procedimiento RAISE_APPLICATION_ERROR se puede utilizar tanto en el cdigo ejecutable y las secciones excepcin de un programa de PL / SQL. He aqu otro ejemplo de utilizacin del procedimiento RAISE_APPLICATION_ERROR:

Resumen En esta leccin, usted aprendi cmo hacer frente a diferentes tipos de excepciones. En PL / SQL, un aviso o una condicin de error en tiempo de ejecucin se denomina una excepcin. Excepciones predefinidas son las condiciones de error que se definen por el servidor Oracle. Excepciones no predefinidas pueden ser los errores de servidor estndar de Oracle. Excepciones definidas por el usuario son excepciones especficas para su aplicacin. La funcin de PRAGMA EXCEPTION_INIT se puede utilizar para asociar un nombre de excepcin declarado con un error en el servidor Oracle. Usted puede definir excepciones de su cuenta en la seccin declarativa de un bloque PL / SQL. Por ejemplo, puede definir una excepcin llamada INSUFFICIENT_FUNDS de bandera cuentas bancarias en descubierto. Cuando se produce un error, se produce una excepcin. Se detendr la ejecucin normal y transfiere el control a la seccin de control de excepciones de su bloque PL / SQL. Excepciones

internas se plantearon implcitamente (automticamente) por el sistema de tiempo de ejecucin, sin embargo, excepciones definidas por el usuario deben ser planteadas de forma explcita. Para controlar las excepciones planteadas, se escribe rutinas separadas llamadas controladores de excepciones. En esta leccin, debe haber aprendido a: Definir PL / SQL excepciones Aadir una seccin excepcin al bloque PL / SQL para hacer frente a las excepciones en tiempo de ejecucin Manejo de diferentes tipos de excepciones: excepciones predefinidas Excepciones no predefinidas Las excepciones definidas por el usuario Propagar excepciones en bloques anidados y llamar a las aplicaciones

You might also like