Het probleem is dat je een fetch probeert te doen via een commit.
Wanneer u My_Data_Cur
. opent met de for update
clausule, moet Oracle elke rij in de My_Data_1
tabel voordat het rijen kan retourneren. Wanneer je commit
, moet Oracle al die vergrendelingen vrijgeven (de vergrendelingen die Oracle maakt, omvatten geen transacties). Aangezien de cursor niet langer de door u gevraagde vergrendelingen heeft, moet Oracle de cursor sluiten omdat deze niet langer kan voldoen aan de for update
clausule. De tweede fetch moet daarom 0 rijen opleveren.
De meest logische benadering zou bijna altijd zijn om de commit
. te verwijderen en doe het hele ding in een enkele transactie. Als je echt, echt, aparte transacties nodig hebt, zou je de cursor voor elke iteratie van de lus moeten openen en sluiten. Hoogstwaarschijnlijk zou u iets willen doen om de cursor te beperken tot slechts 100 rijen elke keer dat deze wordt geopend (d.w.z. een rownum <= 100
clausule) zodat u niet de kosten hoeft te maken om elke rij te bezoeken om de vergrendeling te plaatsen en vervolgens elke andere rij dan de 100 die u heeft verwerkt en verwijderd om de vergrendeling elke keer door de lus te ontgrendelen.