sql >> Databasteknik >  >> RDS >> Oracle

massinsamling med för uppdatering

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 för uppdatering klausul. Den andra hämtningen måste därför returnera 0 rader.

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.



  1. Codeigniter :Fel i ORDER BY CASE-frågan

  2. Ta bort tomma rader

  3. Frågar understrängar mot en lista med värden

  4. Varför använda ramverk? Övertyga mig om att jag borde ta reda på Zend Framework och använda det