sql >> Databasteknik >  >> RDS >> Oracle

Utlösa if-else-satsfelet höjs inte

Utlösaren fungerar som du förväntar dig när du uppdaterar tabellen manuellt.

När den anropas från proceduren rapporterar utlösaren inte ett ogiltigt belopp och visar hela beloppet som betalt även om det inte var det - betalningsbeloppet ändras inte utan de andra kolumnerna är det.

Det beror på att din procedurs uppdateringsförklaring är:

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

Du säger inte åt den att uppdatera beloppet, så utlösaren har inte en modifierad :new värde - det gamla och det nya är samma. Du måste inkludera den kolumnen i uppdateringen:

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

db<>fiol

TO_CHAR(sysdate,'DD/MON/YYYY') ser udda ut - tabellkolumnen ska vara ett datum inte en sträng, så du bör inte konvertera det värdet till en sträng; om kolumnen är ett datum så litar du på klientens NLS-inställningar för att konvertera tillbaka det. Om du försöker ignorera den aktuella tiden kan du göra TRUNC(sysdate) istället.

Du bör inte heller lita på dbms_output i procedurkroppen - du kan inte kontrollera om någon som anropar detta har utdata aktiverat så att de aldrig ser något problem. Eftersom du gör ett undantag i utlösaren kan du göra detsamma i proceduren för de andra felen.




  1. lagra data i en databas med hjälp av redigera text och knapp

  2. Finns det något sätt att automatiskt skapa en trigger vid skapandet av en ny tabell i MySQL?

  3. Kaskadkopia av rader i sql

  4. VB MySql AddWithValue skickar inte värdet framgångsrikt