Di oracle ada dua level pemicu:level baris dan level tabel.
Pemicu tingkat baris dijalankan for each row
. Pemicu tingkat tabel dieksekusi per pernyataan, meskipun pernyataan berubah lebih dari satu baris.
Dalam pemicu tingkat baris, Anda tidak dapat memilih/memperbarui tabel itu sendiri yang memiliki pemicu:Anda akan mendapatkan kesalahan mutasi.
Dalam hal ini, tidak diperlukan pernyataan UPDATE. Coba saja ini:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
EDIT Rajesh menyebutkan mungkin, bahwa sebelum memasukkan baris baru, OP ingin memperbarui semua catatan lain di aso_quote_headers_all
tabel.
Nah, ini layak, tapi itu sedikit rumit. Untuk melakukannya dengan benar, Anda memerlukan
- Paket pl/sql dan variabel di header paket yang dimodifikasi oleh pemicu. Variabel ini bisa berupa daftar yang menyimpan ID catatan yang baru dimasukkan. Tingkat baris setelah pemicu penyisipan akan menambahkan ID baru ke daftar. Isi variabel paket ini akan berbeda untuk setiap sesi yang berbeda, jadi sebut saja variabel ini
session_variable
. - Tingkat baris setelah pemicu penyisipan, yang akan menambahkan ID baru ke
session_variable
. - Tingkat tabel setelah pemicu penyisipan yang akan mendapatkan ID dari
session_variable
, proses ID lalu hapus darisession_variable
. Pemicu ini dapat menjalankan pemilihan/pembaruan yang diperlukan pada aso_quote_headers_all. Setelah ID yang baru dimasukkan diproses, pemicu ini harus memastikannya dihapus darisession_variable
.