sql >> Database >  >> RDS >> Oracle

bulk verzamelen met voor update

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.



  1. MySQL CREATE TIJDELIJKE TABEL Fout

  2. Verschil tussen zwevend en decimaal gegevenstype

  3. Een overzicht van logische replicatie in PostgreSQL

  4. Slaapstand geparametriseerde sql-query langzame en actieve Oracle-sessies