Gestión de Excepciones en Oracle PL/SQL

Tipos de excepciones en Oracle PLSQL y su sintaxis

Oracle permite gestionar excepciones. Las excepciones suelen producirse cuando hay un error en la ejecución de un bloque PL/SQL, y como en otros lenguajes de programación es posible manipularlas, ya sea interrumpiendo la ejecución o propagando la excepción para que se trate en otra parte del código.

Sintaxis de excepción en Oracle

Un ejemplo de sintaxis podría ser este.

WHEN excepcion1 
  OR excepcion2 
THEN
  expression;

WHEN excepcion3 
  THEN expression;
  WHEN OTHERS 
  THEN
  expression;

Vemos que podemos especificar la excepción a tratar. WHEN OTHERS sirve para tratar el resto de excepciones sin especificar su nombre.

Tipos de Excepciones PL/SQL

Predefinida por Oracle. Son las que ya vienen predefinidas por el servidor Oracle como por ejemplo.

  • ACCESS_INTO_NULL. Un programa intenta asignar valores a atributos de un objeto no inicializado.
  • CASE_NOT_FOUND. Ninguna de las posibilidades en una cláusula WHEN de una expressión CASE está seleccionada y no hay cláusula ELSE.
  • COLLECTION_IS_NULL. Un programa intenta aplicar otros métodos diferentes de EXISTS a una tabla o array no inicializada.
  • CURSOR_ALREADY_OPEN. Se intenta abrir un cursor ya abierto. Se debe cerrar siempre los cursores después de usarlos. Un bucle FOR siempre abre los cursores automáticamente.
  • DUP_VAL_ON_INDEX. Duplicación de valores en una columna que contiene un índice único.
  • INVALID_CURSOR. Operacion de cursor no permitida, como cerrar un cursor no abierto.
  • INVALID_NUMBER. Conversion de un caracter a número fallida porque la cadena no representa un número válido.
  • LOGIN_DENIED. Nombre de usuario y/o contraseñna inválida.
  • NO_DATA_FOUND. Si un SELECT INTO no devuelve filas
  • NOT_LOGGED_ON. Si no se está conectado a Oracle.
  • PROGRAM_ERROR. Error interno de PL/SQL.
  • ROWTYPE_MISTMATCH. Valores de retorno incompatibles.
  • SELF_IS_NULL. Llamada al método de un objeto no inicializado.
  • STORAGE_ERROR. PL/SQL se queda sin memoria, o la memoria se ha corrompido.
  • SUBSCRIPT_BEYOND_COUNT. Un programa hace referencia a una tabla o array usando un índice mayour que el número de elementos que contiene.
  • SUBSCRIPT_OUTSIDE_LIMIT. Un programa hace referencia a una tabla o array usando un índice fuera de rango.
  • SYS_INVALID_ROWID. La conversion de cadena de texto a identificador de fila falla porque no representa un identificador de fila válido.
  • TIMEOUT_ON_RESOURCE. Se supera el tiempo de espera máximo para el uso de un recurso.
  • TOO_MANY_ROWS. Demasiadas filas devueltas.
  • VALUE_ERROR. Error aritmético, de conversión o truncación.
  • ZERO_DIVIDE. División por zero.

Ejemplo:

BEGIN
  SELECT ...;
    EXCEPTION
  WHEN ZERO_DIVIDE 
  THEN
    expression;
  DBMS_OUTPUT.PUT_LINE('La operación de ' || TO_CHAR(variable) || ' es inválida');
END

No predefinida por Oracle. Son las que no tienen un nombre asociado como las anteriores, pero sí un número. Por ejemplo para interrumpir en caso de una violación de integridad:

DECLARE
  nombreExcepcion EXCEPTION;
  PRAGMA EXCEPTION_INIT(nombreExcepcion, -2292);
  ...
  BEGIN
  ...
  EXCEPTION
  WHEN nombreExcepcion THEN
    DBMS_OUTPUT.PUT_LINE ('Excepción de integridad producida');
  ...
END;

Definida por el programador. Son las que pueden definir los programadores para gestionar los errores en su código.

DECLARE
nombreExcepcion EXCEPTION;

...
BEGIN
...
RAISE nombreExcepcion;
...
EXCEPTION
WHEN nombreExcepcion THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido una excepción');

Esto son los tipos de excepciones que existen en PLSQL del servidor Oracle.