Oracle/PL/SQL/Excepciones

Cuando se produce un error, este genera un excepción (Exception). Por ejemplo, si se realiza una división por cero:

begin
  ...
  num := 1;
  den := 0;
  valor := num / den;
  ...
exception
  when ZERO_DIVIDE then
    -- Instrucciones
    ...
end;

En caso que no pueda manejarse el error, puede pasarse al bloque externo mediante RAISE:

begin
  ...
exception
  when OTHERS then
    if sqlcode = -4 then
      -- Manejar el error
      ...
    else
      raise;  -- El error sigue su curso como si nunca hubiera sido detectado por la sección exception
    end if;
end;

Excepciones predefinidas

editar

Las excepciones predefinidas más usuales son:

  -- Relacionadas con tipos de datos
  INVALID_NUMBER, VALUE_ERROR, ZERO_DIVIDE

  -- Relacionadas con operaciones de SQL
  DUP_VAL_ON_INDEX, NO_DATA_FOUND, TOO_MANY_ROWS

  -- Relacionadas con Cursores
  CURSOR_ALREADY_OPEN, INVALID_CURSOR

Excepciones definidas por el Usuario

editar

Si se desea generar un error, puede utilizarse RAISE_APPLICATION_ERROR:

  ...
  raise_application_error(-20100, 'Mensaje del Error 20100, definido por el usuario');
  ...

El rango de errores destinado al usuario va entre -20000 y -20999.

Alternativamente, puede declararse una excepción y generar el error mediante RAISE:

declare
  mi_error exception;
begin
  ...
  if hay_error then
    raise mi_error;
  end if;
  ...
exception
  when mi_error then
    ...
end;

Finalmente, puede asignarse nombre de excepción a un error, mediante PRAGMA EXCEPTION_INIT:

declare
  hay_deadlock EXCEPTION;
  PRAGMA EXCEPTION_INIT(hay_deadlock, -60);
begin
  ...
exception
  when hay_deadlock then
    ...
end;