Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Trigger if-else-Anweisungsfehler wird nicht ausgelöst

Der Trigger funktioniert wie erwartet, wenn Sie die Tabelle manuell aktualisieren.

Wenn er von der Prozedur aufgerufen wird, meldet der Trigger keinen ungültigen Betrag und zeigt den vollen Betrag als bezahlt an, selbst wenn dies nicht der Fall war - der Zahlungsbetrag wird nicht geändert, aber die anderen Spalten werden geändert.

Das liegt daran, dass die Update-Anweisung Ihrer Prozedur lautet:

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

Sie sagen ihm nicht, dass es den Betrag aktualisieren soll, also hat der Trigger keinen modifizierten :new Wert - alt und neu sind gleich. Sie müssen diese Spalte in das Update aufnehmen:

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

Der TO_CHAR(sysdate,'DD/MON/YYYY') sieht seltsam aus - die Tabellenspalte sollte ein Datum und keine Zeichenfolge sein, also sollten Sie diesen Wert nicht in eine Zeichenfolge umwandeln; Wenn die Spalte ein Datum ist, verlassen Sie sich auf die NLS-Einstellungen des Clients, um es zurückzukonvertieren. Wenn Sie versuchen, die aktuelle Zeit zu ignorieren, können Sie TRUNC(sysdate) ausführen stattdessen.

Sie sollten sich auch nicht auf dbms_output verlassen im Hauptteil der Prozedur - Sie können nicht kontrollieren, ob jemand, der dies aufruft, die Ausgabe aktiviert hat, damit er möglicherweise nie ein Problem sieht. Da Sie im Trigger eine Ausnahme auslösen, könnten Sie dasselbe in der Prozedur für die anderen Fehler tun.