Oracle
 sql >> Database >  >> RDS >> Oracle

raccolta in blocco utilizzando per l'aggiornamento

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.