Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyzwalaj błąd instrukcji if-else, który nie jest zgłaszany

Wyzwalacz działa zgodnie z oczekiwaniami, gdy ręcznie aktualizujesz tabelę.

Po wywołaniu z procedury wyzwalacz nie zgłasza nieprawidłowej kwoty i pokazuje pełną kwotę jako zapłaconą, nawet jeśli tak nie było — kwota płatności nie jest zmieniana, ale inne kolumny są.

Dzieje się tak, ponieważ instrukcja aktualizacji procedury to:

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

Nie każesz mu zaktualizować kwoty, więc wyzwalacz nie ma zmodyfikowanego :new wartość - stare i nowe są takie same. Musisz uwzględnić tę kolumnę w aktualizacji:

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

db<>skrzypce

TO_CHAR(sysdate,'DD/MON/YYYY') wygląda dziwnie - kolumna tabeli powinna być datą, a nie ciągiem, więc nie powinieneś konwertować tej wartości na ciąg; jeśli kolumna jest datą, polegasz na ustawieniach NLS klienta, aby przekonwertować ją z powrotem. Jeśli próbujesz zignorować aktualny czas, możesz wykonać TRUNC(sysdate) zamiast tego.

Nie powinieneś też polegać na dbms_output w ciele procedury - nie możesz kontrolować, czy osoba wywołująca to ma włączone wyjście, więc może nigdy nie zobaczyć problemu. Gdy zgłaszasz wyjątek w regule, możesz zrobić to samo w procedurze dla innych błędów.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. wyrocznia jak obrócić mój stół

  2. Błąd podczas wykonywania pakietu

  3. Konwertuj skrypt Coldfusion w widoku Oracle za pomocą CASE i iteracji

  4. Wielokrotne powtarzanie tej samej zmiennej bind przy użyciu dynamicznej struktury OPEN...FOR w Oracle PL/SQL

  5. PHP:pole oci_bind_by_name i timestamp daje wynik ORA-01461:może powiązać wartość LONG tylko w przypadku wstawienia do kolumny LONG