El problema es que estás tratando de obtener una confirmación.
Cuando abres My_Data_Cur
con el for update
cláusula, Oracle tiene que bloquear cada fila en My_Data_1
tabla antes de que pueda devolver filas. Cuando commit
, Oracle tiene que liberar todos esos bloqueos (los bloqueos que crea Oracle no abarcan las transacciones). Dado que el cursor ya no tiene los bloqueos que solicitó, Oracle tiene que cerrar el cursor ya que ya no puede satisfacer el for update
cláusula. La segunda búsqueda, por lo tanto, debe devolver 0 filas.
El enfoque más lógico casi siempre sería eliminar el commit
y hacer todo en una sola transacción. Si realmente necesita transacciones separadas, deberá abrir y cerrar el cursor para cada iteración del ciclo. Lo más probable es que desee hacer algo para restringir el cursor para que solo devuelva 100 filas cada vez que se abre (es decir, un rownum <= 100
cláusula) para que no incurra en el gasto de visitar cada fila para colocar el bloqueo y luego cada fila que no sea la 100 que procesó y eliminó para liberar el bloqueo cada vez que pasa por el ciclo.