Тригерът работи както очаквате, когато актуализирате таблицата ръчно.
Когато се извика от процедурата, тригерът не отчита невалидна сума и показва пълната сума като платена, дори и да не е - сумата на плащането не се променя, но другите колони са.
Това е така, защото изразът за актуализиране на вашата процедура е:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Не му казвате да актуализира сумата, така че тригерът няма модифициран :new
стойност - старото и новото са еднакви. Трябва да включите тази колона в актуализацията:
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')
изглежда странно - колоната на таблицата трябва да е дата, а не низ, така че не трябва да конвертирате тази стойност в низ; ако колоната е дата, тогава разчитате на NLS настройките на клиента, за да я конвертирате обратно. Ако се опитвате да игнорирате текущия час, можете да направите TRUNC(sysdate)
вместо това.
Също така не трябва да разчитате на dbms_output
в тялото на процедурата - не можете да контролирате дали някой, който вика това, има активиран изход, така че може никога да не види проблем. Тъй като предизвиквате изключение в тригера, можете да направите същото в процедурата за другите грешки.