De trigger werkt zoals u verwacht wanneer u de tabel handmatig bijwerkt.
Wanneer vanuit de procedure wordt aangeroepen, meldt de trigger geen ongeldig bedrag en wordt het volledige bedrag als betaald weergegeven, zelfs als dit niet het geval was - het betalingsbedrag wordt niet gewijzigd, maar de andere kolommen wel.
Dat komt omdat de update-instructie van uw procedure is:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Je vertelt het niet om het bedrag bij te werken, dus de trigger heeft geen gewijzigde :new
waarde - oud en nieuw zijn hetzelfde. U moet die kolom in de update opnemen:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
De TO_CHAR(sysdate,'DD/MON/YYYY')
ziet er vreemd uit - de tabelkolom zou een datum moeten zijn en geen string, dus je zou die waarde niet naar een string moeten converteren; als de kolom een datum is, vertrouwt u op de NLS-instellingen van de klant om deze terug te converteren. Als u de huidige tijd probeert te negeren, kunt u TRUNC(sysdate)
doen in plaats daarvan.
U moet ook niet vertrouwen op dbms_output
in de hoofdtekst van de procedure - u kunt niet bepalen of iemand die dit aanroept uitvoer heeft ingeschakeld, zodat ze mogelijk nooit een probleem zien. Omdat je een uitzondering maakt in de trigger, kun je hetzelfde doen in de procedure voor de andere fouten.