sql >> Database >  >> RDS >> Oracle

Trigger if-else-instructiefout die niet wordt gegenereerd

De trigger werkt zoals u verwacht wanneer u de tabel handmatig bijwerkt.

Wanneer vanuit de procedure wordt aangeroepen, meldt de trigger geen ongeldig bedrag en wordt het volledige bedrag als betaald weergegeven, zelfs als dit niet het geval was - het betalingsbedrag wordt niet gewijzigd, maar de andere kolommen wel.

Dat komt omdat de update-instructie van uw procedure is:

UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

Je vertelt het niet om het bedrag bij te werken, dus de trigger heeft geen gewijzigde :new waarde - oud en nieuw zijn hetzelfde. U moet die kolom in de update opnemen:

UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentamount = amt_pay,
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

db<>fiddle

De TO_CHAR(sysdate,'DD/MON/YYYY') ziet er vreemd uit - de tabelkolom zou een datum moeten zijn en geen string, dus je zou die waarde niet naar een string moeten converteren; als de kolom een ​​datum is, vertrouwt u op de NLS-instellingen van de klant om deze terug te converteren. Als u de huidige tijd probeert te negeren, kunt u TRUNC(sysdate) doen in plaats daarvan.

U moet ook niet vertrouwen op dbms_output in de hoofdtekst van de procedure - u kunt niet bepalen of iemand die dit aanroept uitvoer heeft ingeschakeld, zodat ze mogelijk nooit een probleem zien. Omdat je een uitzondering maakt in de trigger, kun je hetzelfde doen in de procedure voor de andere fouten.




  1. Django get_or_create kan veld niet instellen bij gebruik met iexact

  2. Geef ID's door aan pre_get_posts-query in functie

  3. Een schemagebonden opgeslagen procedure maken in SQL Server

  4. MySQL UITLEG 'type' verandert van 'bereik' in 'ref' wanneer de datum in het waar-statement wordt gewijzigd?