sql >> Database teknologi >  >> RDS >> Oracle

Trigger if-else sætningsfejlen bliver ikke rejst

Udløseren fungerer, som du forventer, når du opdaterer tabellen manuelt.

Når den kaldes fra proceduren, rapporterer udløseren ikke et ugyldigt beløb og viser det fulde beløb som betalt, selvom det ikke var - betalingsbeløbet ændres ikke, men det er de andre kolonner.

Det er fordi din procedures opdateringserklæring er:

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

Du beder den ikke opdatere beløbet, så udløseren har ikke en ændret :new værdi - det gamle og det nye er det samme. Du skal inkludere den kolonne i opdateringen:

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

db<>violin

TO_CHAR(sysdate,'DD/MON/YYYY') ser mærkeligt ud - tabelkolonnen skal være en dato og ikke en streng, så du bør ikke konvertere denne værdi til en streng; hvis kolonnen er en dato, er du afhængig af klientens NLS-indstillinger for at konvertere den tilbage. Hvis du prøver at ignorere det aktuelle tidspunkt, kan du gøre TRUNC(sysdate) i stedet.

Du bør heller ikke stole på dbms_output i procedureteksten - du kan ikke kontrollere, om nogen, der kalder dette, har output aktiveret, så de kan aldrig se et problem. Da du rejser en undtagelse i triggeren, kan du gøre det samme i proceduren for de andre fejl.




  1. Skrive hebraisk til mySql ved hjælp af JAVA

  2. Sådan fungerer UPPER() i MariaDB

  3. Jeg kan ikke starte Mysql 5.6 server på grund af TIMESTAMP med implicit DEFAULT værdi er forældet Fejl?

  4. Hvorfor min pessimistiske låsning af JPA med Oracle ikke virker