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

Attivare l'errore dell'istruzione if-else che non viene generato

Il trigger funziona come previsto quando aggiorni la tabella manualmente.

Quando viene chiamato dalla procedura il trigger non segnala un importo non valido e mostra l'intero importo come pagato anche se non lo era - l'importo del pagamento non viene modificato ma lo sono le altre colonne.

Questo perché la dichiarazione di aggiornamento della tua procedura è:

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

Non gli stai dicendo di aggiornare l'importo, quindi l'attivatore non ha un :new modificato valore - il vecchio e il nuovo sono gli stessi. Devi includere quella colonna nell'aggiornamento:

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

db<>violino

Il TO_CHAR(sysdate,'DD/MON/YYYY') sembra strano:la colonna della tabella dovrebbe essere una data non una stringa, quindi non dovresti convertire quel valore in una stringa; se la colonna è una data, ti stai basando sulle impostazioni NLS del client per riconvertirla. Se stai cercando di ignorare l'ora corrente, puoi eseguire TRUNC(sysdate) invece.

Inoltre, non dovresti fare affidamento su dbms_output nel corpo della procedura - non puoi controllare se qualcuno che chiama questo ha l'output abilitato in modo che non possano mai vedere un problema. Poiché stai sollevando un'eccezione nel trigger, puoi fare lo stesso nella procedura per gli altri errori.