Wyzwalacz działa zgodnie z oczekiwaniami, gdy ręcznie aktualizujesz tabelę.
Po wywołaniu z procedury wyzwalacz nie zgłasza nieprawidłowej kwoty i pokazuje pełną kwotę jako zapłaconą, nawet jeśli tak nie było — kwota płatności nie jest zmieniana, ale inne kolumny są.
Dzieje się tak, ponieważ instrukcja aktualizacji procedury to:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Nie każesz mu zaktualizować kwoty, więc wyzwalacz nie ma zmodyfikowanego :new
wartość - stare i nowe są takie same. Musisz uwzględnić tę kolumnę w aktualizacji:
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')
wygląda dziwnie - kolumna tabeli powinna być datą, a nie ciągiem, więc nie powinieneś konwertować tej wartości na ciąg; jeśli kolumna jest datą, polegasz na ustawieniach NLS klienta, aby przekonwertować ją z powrotem. Jeśli próbujesz zignorować aktualny czas, możesz wykonać TRUNC(sysdate)
zamiast tego.
Nie powinieneś też polegać na dbms_output
w ciele procedury - nie możesz kontrolować, czy osoba wywołująca to ma włączone wyjście, więc może nigdy nie zobaczyć problemu. Gdy zgłaszasz wyjątek w regule, możesz zrobić to samo w procedurze dla innych błędów.