Spouštěč funguje tak, jak očekáváte, když tabulku aktualizujete ručně.
Při volání z procedury spouštěč nehlásí neplatnou částku a zobrazuje celou částku jako zaplacenou, i když nebyla – částka platby se nezmění, ale ostatní sloupce ano.
Je to proto, že prohlášení o aktualizaci vaší procedury je:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Neříkáte mu, aby aktualizoval částku, takže spouštěč nemá upravené :new
hodnota - staré a nové jsou stejné. Tento sloupec musíte zahrnout do aktualizace:
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')
vypadá zvláštně - sloupec tabulky by měl být datum, nikoli řetězec, takže byste neměli převádět tuto hodnotu na řetězec; pokud je ve sloupci datum, spoléháte na to, že jej převedete zpět na nastavení NLS klienta. Pokud se snažíte ignorovat aktuální čas, můžete provést TRUNC(sysdate)
místo toho.
Také byste se neměli spoléhat na dbms_output
v těle procedury - nemůžete kontrolovat, zda má někdo, kdo toto volá, povolen výstup, takže nikdy nemusí vidět problém. Když vyvoláváte výjimku ve spouštěči, můžete totéž udělat v postupu pro ostatní chyby.