¿Cómo manipular errores en pl sql?

Ojala me puedas ayudar tengo el siguiente problema, mediante un trigger válido un valor por que no sea mayor que y y la idea es que si lo es o es igual no debe insertar ni hacer nada, lo que tengo es lo siguiente:
Create or replace
TRIGGER TRI_CTL_CLIENTE
before INSERT OR DELETE ON CLIENTE
FOR EACH ROW
declare
maximo_suc number;
num_clientes number;
fallo EXCEPTION;
BEGIN
  IF INSERTING THEN
  select suc_cmax , suc_nro_cli into maximo_suc, num_clientes from sucursal where suc_cod=:NEW.CLI_SUCURSAL;
    if maximo_suc > num_clientes then
      UPDATE SUCURSAL
      SET SUC_NRO_CLI=NVL(SUC_NRO_CLI,0)+1
      WHERE SUC_COD=:NEW.CLI_SUCURSAL;
      else
        RAISE fallo;
    end if;
  end if;
  IF DELETING THEN
    UPDATE SUCURSAL
    SET SUC_NRO_CLI=NVL(SUC_NRO_CLI,0)-1
    WHERE SUC_COD=:OLD.CLI_SUCURSAL;
  end if;
  EXCEPTION
       WHEN fallo THEN
         dbms_output.put_line (' valor maximo superado ' ||SYSDATE);       
  RAISE;  
END;
El error que arroja es:
Informe de error:
Error SQL: ORA-06510: PL/SQL: excepción definida por el usuario no tratada
ORA-06512: en "TRI_CTL_CLIENTE", línea 28
ORA-04088: error durante la ejecución del disparador 'TRI_CTL_CLIENTE'
06510. 00000 - "PL/SQL: unhandled user-defined exception"
*Cause:    A user-defined exception was raised by PL/SQL code, but
           not handled.
*Action:   Fix the problem causing the exception or write an exception
           handler for this condition. Or you may need to contact your
           Application administrator or DBA.
Claro q no agrega al fulano, es decir no lo ingresa por lo tanto desde el punto de vista de la base de datos no ingreso un cliente q superaba el maximo de clientes para esa sucursal.

1 respuesta

Respuesta
1
El problema viene porque haces un raise en una excepción definida por ti y no sabe que error devolver. El raise se utilizaen en excepciones ya definidas.
La mejor solución es utilizar raise_application_error.
EXCEPTION
WHEN fallo THEN
raise_application_error(-20001,'' valor maximo superado ' ||SYSDATE);
END;
El código de error tiene que se a partir de -20000 el resto ya están reservadors por oracle.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas