sql >> Base de Datos >  >> RDS >> Oracle

Activar el error de declaración if-else que no se genera

El disparador funciona como espera cuando actualiza la tabla manualmente.

Cuando se llama desde el procedimiento, el activador no informa un monto no válido y muestra el monto total como pagado incluso si no lo fue; el monto del pago no cambia, pero las otras columnas sí.

Eso es porque la declaración de actualización de su procedimiento es:

UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

No le está diciendo que actualice la cantidad, por lo que el activador no tiene un :new modificado Valor:lo antiguo y lo nuevo son iguales. Debe incluir esa columna en la actualización:

UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentamount = amt_pay,
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

db<>fiddle

El TO_CHAR(sysdate,'DD/MON/YYYY') se ve extraño:la columna de la tabla debe ser una fecha, no una cadena, por lo que no debe convertir ese valor en una cadena; si la columna es una fecha, entonces confía en la configuración NLS del cliente para volver a convertirla. Si está tratando de ignorar la hora actual, puede hacer TRUNC(sysdate) en su lugar.

Tampoco debe confiar en dbms_output en el cuerpo del procedimiento:no puede controlar si alguien que llama tiene la salida habilitada, por lo que es posible que nunca vea un problema. Como está lanzando una excepción en el disparador, puede hacer lo mismo en el procedimiento para los otros errores.