Oracle
 sql >> Base de données >  >> RDS >> Oracle

Déclencher une erreur d'instruction if-else non déclenchée

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;

db<>violon

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.