Problemet är att du försöker göra en hämtning över en commit.
När du öppnar My_Data_Cur
med för uppdatering
Oracle måste låsa varje rad i My_Data_1
tabell innan den kan returnera några rader. När du begår
, Oracle måste släppa alla dessa lås (låsen som Oracle skapar omfattar inte transaktioner). Eftersom markören inte längre har de lås som du begärde måste Oracle stänga markören eftersom den inte längre kan uppfylla
Det mest logiska tillvägagångssättet skulle nästan alltid vara att ta bort commit
och gör allt i en enda transaktion. Om du verkligen, verkligen, verkligen behöver separata transaktioner, skulle du behöva öppna och stänga markören för varje iteration av loopen. Troligtvis skulle du vilja göra något för att begränsa markören till att bara returnera 100 rader varje gång den öppnas (dvs. ett rownum <=100
klausul) så att du inte skulle ta på dig kostnaden för att besöka varje rad för att placera låset och sedan varje rad förutom de 100 som du bearbetade och raderade för att frigöra låset varje gång genom slingan.