Anuncios en tutorial de programación PLSQL

viernes, 23 de febrero de 2018

Gestión de errores en PLSQL - Visión general

Incluso si fuéramos capaces de escribir un programa PL/SQL absolutamente perfecto, es altamente probable que algo pueda ir mal y se produzcan errores durante la ejecución. La manera en que nuestro código responde frente a estos errores, a menudo determina la diferencia entre una aplicación que funciona correctamente y otra que da continuos problemas a los usuarios y a los encargados de su mantenimiento.

Gestión de errores

Este es el primer artículo de una serie que escribiré sobre la gestión de errores en PLSQL. En ellos podréis leer sobre: los diferentes tipos de excepciones que se pueden dar; cuándo, cómo y por qué se generan excepciones; cómo definir nuestras propias excepciones; como manejar las excepciones cuando estas se producen; y cómo es posible informar a los usuarios cuando aparece un problema.

Visión general sobre las excepciones PL/SQL


En PL/SQL existen tres categorías de excepciones diferentes: internamente definidas, predefinidas y definidas por el usuario.

Excepciones internamente definidas: son excepciones generadas internamente por la base de datos Oracle. Este tipo de excepciones siempre devuelven un código de error, pero no tienen un nombre asignado a menos que nosotros le asignemos alguno en nuestro código PLSQL.

Un ejemplo de este tipo de excepción sería:
ORA-00060: detectado interbloqueo mientras se esperaba un recurso

Excepciones predefinidas: son excepciones internamente definidas que ya tienen un nombre asignado por el propio PL/SQL (ver este artículo). La mayoría de este tipo de excepciones se encuentran definidas en un paquete estándar que proporciona la propia base de datos Oracle, paquete donde se definen muchos de los elementos comunes del leguaje de programación PLSQL y, dentro de estos elementos comunes, se incluyen los nombres de las excepciones que se producen más comúnmente.

Un ejemplo de este tipo de excepción sería:
ORA-01413: no se ha encontrado ningún dato
(nombre: NO_DATA_FOUND)

Excepciones definidas por el usuario: se tratan de excepciones que el programador ha declarado el la sección DECLARE de una unidad de programa. Este tipo de excepciones se pueden asociar con una excepción definida internamente (asignándole un nombre concreto) o con un error específico de nuestro programa PL/SQL (ver este artículo).

Todas las excepciones tienen un código y un mensaje de error asociado. Cuando estamos manejando una excepción, la base de datos Oracle proporciona funciones específicas para recuperar dichos valores:
  • SQLCODE: Devuelve el código de error, básicamente un número que identifica el tipo de error. Esta función no puede utilizarse dentro de una sentencia SQL.
  • SQLERRM: Devuelve el mensaje de error. Estos mensajes normalmente contienen información sobre el nombre de la columna o el objeto que está asociado con el error. Esta función tampoco puede utilizarse dentro de una sentencia SQL.
  • DBMS_UTILITY.FORMAT_ERROR_STACK: Igual que SQLERRM pero sí que puede incluirse en una sentencia SQL.
  • DBMS_UTILITY.FORMAT_ERROR_BACKTRACE: Devuelve la línea en la que ocurre el error. Esta función fue añadida por primera vez en la Versión 10g Release 2 de las bases de datos Oracle y resulta de gran ayuda a la hora de identificar la causa del error.
  • DBMS_UTILITY.FORMAT_CALL_STACK: Devuelve la secuencia de todas las llamadas a procedimientos y funciones hasta que se produjo el error. Responde a la pregunta ”¿Cómo el código PLSQL ha llegado hasta aquí?”, mostrando el camino seguido en nuestro código hasta el momento en que llamamos a esta función.

Ya hemos visto en algún artículo que un bloque PL/SQL dispone de tres secciones diferentes: DECLARE (declaración de cursores y variables), BEGIN (código ejecutable) y EXCEPTION (manejo de excepciones). Cuando se produce una excepción en la sección BEGIN, ninguna de las sentencias que quedan por ejecutar en dicha sección se ejecutan. Por el contrario, el control pasa a la sección EXCEPTION correspondiente.

Lo bueno de este funcionamiento es que el manejo de todas las excepciones relativas a un mismo bloque PLSQL se concentran en una única sección, facilitando a los desarrolladores la comprensión y el mantenimiento de la lógica de la gestión de errores. En la siguiente figura podéis ver los flujos de ejecución en un bloque PL/SQL cuando ocurre un error. El proceso de generación de errores y la estructura de la sección EXCEPTION la describiré con más profundidad en siguientes artículos.


Como avanzadilla indicaré que la sección EXCEPTION debe incluir cláusulas WHEN para capturar los errores que nos interese manejar, el código de dentro del WHEN normalmente sacará información sobre el error generado y lo pondrá en el log del programa. Posteriormente, se podrá continuar la ejecución del programa o detenerla generando otra excepción.

Si la sección EXCEPTION no captura el error o simplemente no existe dicha sección, el error se propagará fuera del bloque al bloque superior y el error se gestionará en la sección EXCEPTION de dicho bloque superior, obviamente si ésta existiese.

0 comentarios: