Udløseren fungerer, som du forventer, når du opdaterer tabellen manuelt.
Når den kaldes fra proceduren, rapporterer udløseren ikke et ugyldigt beløb og viser det fulde beløb som betalt, selvom det ikke var - betalingsbeløbet ændres ikke, men det er de andre kolonner.
Det er fordi din procedures opdateringserklæring er:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Du beder den ikke opdatere beløbet, så udløseren har ikke en ændret :new
værdi - det gamle og det nye er det samme. Du skal inkludere den kolonne i opdateringen:
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 mærkeligt ud - tabelkolonnen skal være en dato og ikke en streng, så du bør ikke konvertere denne værdi til en streng; hvis kolonnen er en dato, er du afhængig af klientens NLS-indstillinger for at konvertere den tilbage. Hvis du prøver at ignorere det aktuelle tidspunkt, kan du gøre TRUNC(sysdate)
i stedet.
Du bør heller ikke stole på dbms_output
i procedureteksten - du kan ikke kontrollere, om nogen, der kalder dette, har output aktiveret, så de kan aldrig se et problem. Da du rejser en undtagelse i triggeren, kan du gøre det samme i proceduren for de andre fejl.