Utlösaren fungerar som du förväntar dig när du uppdaterar tabellen manuellt.
När den anropas från proceduren rapporterar utlösaren inte ett ogiltigt belopp och visar hela beloppet som betalt även om det inte var det - betalningsbeloppet ändras inte utan de andra kolumnerna är det.
Det beror på att din procedurs uppdateringsförklaring är:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Du säger inte åt den att uppdatera beloppet, så utlösaren har inte en modifierad :new
värde - det gamla och det nya är samma. Du måste inkludera den kolumnen i uppdateringen:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
TO_CHAR(sysdate,'DD/MON/YYYY')
ser udda ut - tabellkolumnen ska vara ett datum inte en sträng, så du bör inte konvertera det värdet till en sträng; om kolumnen är ett datum så litar du på klientens NLS-inställningar för att konvertera tillbaka det. Om du försöker ignorera den aktuella tiden kan du göra TRUNC(sysdate)
istället.
Du bör inte heller lita på dbms_output
i procedurkroppen - du kan inte kontrollera om någon som anropar detta har utdata aktiverat så att de aldrig ser något problem. Eftersom du gör ett undantag i utlösaren kan du göra detsamma i proceduren för de andra felen.