sql >> Base de Datos >  >> RDS >> Oracle

recolección masiva usando para actualizar

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.