Il problema è che stai cercando di eseguire un recupero attraverso un commit.
Quando apri My_Data_Cur
con il for update
clausola, Oracle deve bloccare ogni riga in My_Data_1
tabella prima che possa restituire qualsiasi riga. Quando commit
, Oracle deve rilasciare tutti quei blocchi (i blocchi creati da Oracle non si estendono alle transazioni). Poiché il cursore non ha più i blocchi che hai richiesto, Oracle deve chiudere il cursore poiché non può più soddisfare il for update
clausola. Il secondo recupero, quindi, deve restituire 0 righe.
L'approccio più logico sarebbe quasi sempre rimuovere il commit
e fai tutto in un'unica transazione. Se hai davvero bisogno di transazioni separate, dovresti aprire e chiudere il cursore per ogni iterazione del ciclo. Molto probabilmente, vorresti fare qualcosa per limitare il cursore a restituire solo 100 righe ogni volta che viene aperto (ad esempio un rownum <= 100
clausola) in modo da non dover sostenere la spesa di visitare ogni riga per posizionare il blocco e quindi ogni riga diversa dalle 100 che hai elaborato ed eliminato per rilasciare il blocco ogni volta attraverso il ciclo.