Masalahnya adalah Anda mencoba melakukan pengambilan di seluruh komit.
Saat Anda membuka My_Data_Cur
dengan for update
klausa, Oracle harus mengunci setiap baris di My_Data_1
tabel sebelum dapat mengembalikan baris apa pun. Saat Anda commit
, Oracle harus melepaskan semua kunci itu (kunci yang dibuat Oracle tidak menjangkau transaksi). Karena kursor tidak lagi memiliki kunci yang Anda minta, Oracle harus menutup kursor karena tidak dapat lagi memenuhi for update
ayat. Oleh karena itu, pengambilan kedua harus mengembalikan 0 baris.
Pendekatan yang paling logis hampir selalu menghapus commit
dan melakukan semuanya dalam satu transaksi. Jika Anda benar-benar membutuhkan transaksi terpisah, Anda perlu membuka dan menutup kursor untuk setiap iterasi perulangan. Kemungkinan besar, Anda ingin melakukan sesuatu untuk membatasi kursor agar hanya mengembalikan 100 baris setiap kali dibuka (yaitu rownum <= 100
klausa) sehingga Anda tidak akan dikenakan biaya mengunjungi setiap baris untuk menempatkan kunci dan kemudian setiap baris selain 100 yang Anda proses dan hapus untuk melepaskan kunci setiap kali melalui loop.