EXCEPTION en PL/SQL

Vamos a ver cómo podemos gestionar cuando en alguno de nuestros programas PL/SQL ocurra algún error y cómo procesarlos, y también cómo actuar ante errores internos de Oracle o eventos declarados por el usuario. Para ello se usa el bloque EXCEPTION y los manejadores con sentencias WHEN, seguidos del tipo de excepción a controlar (zero_divide, no_data_found, etc).

Prácticamente todo lo que puede hacerse en la cláusula BEGIN también puede ser hecho en EXCEPTION: sentencias SQL, bucles, estructuras de control de flujo. Es importante saber que una vez que el programa entra en el bloque EXCEPTION ya no puede volver a la cláusula BEGIN. Si un error ocurre y no existe el manejador correspondiente el programa finalizará con un error estándard que describe de forma genérica lo ocurrido. Por ejemplo en un sentencia SELECT si no se localiza ningún registro, y no manejamos excepciones o al menos la excepción "NO_DATA_FOUND", veríamos un error tipo ORA-01403: no data found. Básicamente un manejador puede ser declarado para una excepción particular, para un conjunto de excepciones o globalmente (WHEN OTHERS). Veamos una tabla con los más comunes:


Es posible también crear excepciones personalizadas (eventos definidos por el usuario). Por ejemplo vamos a hacer que el campo Apellidos de la tabla Empleado no pueda contener el valor null:, y forcemos luego a asignarlo a los registros. También es posible forzar manualmente en el código una excepción, sin más que usar la palabra reservada RAISE seguida del nombre de la variable EXCEPTION declarada.  El control de esta situación se ve en este sencillo código:



En la cláusula EXCEPTION muchas veces será útil displayar el código de error, así como el mensaje de dicho error. Para ello existen las variables sqlcode y sqlerrm.

Cada vez que se ejecuta una sentencia SQL se crea un cursor implícito interno, que recoje la información resultante tras correr dicha sentencia y los programadores debemos hacer uso de dicha información para asegurar un buen flujo en nuestro código. Hay varios atributos prácticos en dichos cursores, como comprobar si hay (SQL%FOUND), o no (SQL%NOTFOUND), registros afectados con la sentencia, y caso de haberlos, cuántos hay (SQL%ROWCOUNT), etc. Os dejo un ejemplo, ¡y hasta la próxima!.


No hay comentarios :

Publicar un comentario

Buscar en el Blog: