Jangan pergi ke sana.
ORA-04091: table XXXX is mutating
umumnya merupakan indikator yang baik bahwa apa pun yang Anda coba lakukan terlalu rumit untuk dilakukan dengan andal dengan pemicu.
Tentu, Anda dapat menggunakan variabel array paket dan beberapa pemicu ( aduh!) untuk mengatasi kesalahan ini, tetapi kode Anda kemungkinan besar akan:
- tidak dapat dipertahankan karena kerumitannya dan sifat pemicu yang tidak dapat diprediksi
- tidak merespons dengan baik lingkungan multi-pengguna
Inilah sebabnya mengapa Anda harus memikirkan kembali pendekatan Anda ketika Anda menemukan kesalahan ini. Saya menyarankan Anda untuk membangun satu set prosedur yang dikelompokkan dengan baik dalam sebuah paket untuk menangani konsistensi antar-baris. Cabut semua hak istimewa untuk melakukan DML tabel secara langsung dan gunakan hanya prosedur tersebut untuk memodifikasinya.
Misalnya prosedur pembaruan Anda akan menjadi atom proses yang akan:
- mendapatkan kunci untuk mencegah pembaruan serentak pada grup baris yang sama (misalnya mengunci catatan kamar di aplikasi reservasi hotel).
- periksa apakah baris yang akan disisipkan memvalidasi semua logika bisnis
- buat semua DML yang relevan
- mengembalikan semua perubahannya (dan hanya perubahannya -- bukan seluruh transaksi) jika terjadi kesalahan (mudah dengan PL/SQL, cukup naikkan kesalahan).