Ir al contenido

Oracle/PL/SQL/Excepciones

De Wikilibros, la colección de libros de texto de contenido libre.

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;