Le déclencheur fonctionne comme prévu lorsque vous mettez à jour la table manuellement.
Lorsqu'il est appelé à partir de la procédure, le déclencheur ne signale pas de montant invalide et affiche le montant total comme payé même s'il ne l'était pas - le montant du paiement n'est pas modifié, mais les autres colonnes le sont.
C'est parce que la déclaration de mise à jour de votre procédure est :
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Vous ne lui dites pas de mettre à jour le montant, donc le déclencheur n'a pas de :new
modifié valeur - l'ancien et le nouveau sont les mêmes. Vous devez inclure cette colonne dans la mise à jour :
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Le TO_CHAR(sysdate,'DD/MON/YYYY')
semble étrange - la colonne de la table doit être une date et non une chaîne, vous ne devez donc pas convertir cette valeur en chaîne ; si la colonne est une date, vous comptez sur les paramètres NLS du client pour la reconvertir. Si vous essayez d'ignorer l'heure actuelle, vous pouvez faire TRUNC(sysdate)
à la place.
Vous ne devriez pas non plus vous fier à dbms_output
dans le corps de la procédure - vous ne pouvez pas contrôler si quelqu'un qui appelle ceci a activé la sortie afin qu'il ne voie jamais un problème. Comme vous levez une exception dans le déclencheur, vous pouvez faire de même dans la procédure pour les autres erreurs.