Pemicu berfungsi seperti yang Anda harapkan saat Anda memperbarui tabel secara manual.
Saat dipanggil dari prosedur, pemicu tidak melaporkan jumlah yang tidak valid, dan menunjukkan jumlah penuh sebagai pembayaran meskipun tidak - jumlah pembayaran tidak berubah tetapi kolom lainnya.
Itu karena pernyataan pembaruan prosedur Anda adalah:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
Anda tidak menyuruhnya untuk memperbarui jumlahnya, jadi pemicunya tidak memiliki :new
. yang dimodifikasi nilai - yang lama dan yang baru adalah sama. Anda harus menyertakan kolom itu dalam pembaruan:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
TO_CHAR(sysdate,'DD/MON/YYYY')
terlihat aneh - kolom tabel harus berupa tanggal bukan string, jadi Anda tidak boleh mengonversi nilai tersebut menjadi string; jika kolomnya adalah tanggal maka Anda mengandalkan pengaturan NLS klien untuk mengubahnya kembali. Jika Anda mencoba mengabaikan waktu saat ini, Anda dapat melakukan TRUNC(sysdate)
sebagai gantinya.
Anda juga tidak boleh mengandalkan dbms_output
di badan prosedur - Anda tidak dapat mengontrol apakah seseorang yang memanggil ini memiliki keluaran yang diaktifkan sehingga mereka mungkin tidak pernah melihat masalah. Saat Anda memunculkan pengecualian di pemicu, Anda bisa melakukan hal yang sama dalam prosedur untuk kesalahan lainnya.