Il trigger funziona come previsto quando aggiorni la tabella manualmente.
Quando viene chiamato dalla procedura il trigger non segnala un importo non valido e mostra l'intero importo come pagato anche se non lo era - l'importo del pagamento non viene modificato ma lo sono le altre colonne.
Questo perché la dichiarazione di aggiornamento della tua procedura è:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Non gli stai dicendo di aggiornare l'importo, quindi l'attivatore non ha un :new
modificato valore - il vecchio e il nuovo sono gli stessi. Devi includere quella colonna nell'aggiornamento:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Il TO_CHAR(sysdate,'DD/MON/YYYY')
sembra strano:la colonna della tabella dovrebbe essere una data non una stringa, quindi non dovresti convertire quel valore in una stringa; se la colonna è una data, ti stai basando sulle impostazioni NLS del client per riconvertirla. Se stai cercando di ignorare l'ora corrente, puoi eseguire TRUNC(sysdate)
invece.
Inoltre, non dovresti fare affidamento su dbms_output
nel corpo della procedura - non puoi controllare se qualcuno che chiama questo ha l'output abilitato in modo che non possano mai vedere un problema. Poiché stai sollevando un'eccezione nel trigger, puoi fare lo stesso nella procedura per gli altri errori.