Oracle
 sql >> Base de données >  >> RDS >> Oracle

collecte en bloc à l'aide de la mise à jour

Le problème est que vous essayez d'effectuer une récupération sur un commit.

Lorsque vous ouvrez My_Data_Cur avec le for update clause, Oracle doit verrouiller chaque ligne dans My_Data_1 table avant de pouvoir renvoyer des lignes. Lorsque vous commit , Oracle doit libérer tous ces verrous (les verrous créés par Oracle ne couvrent pas les transactions). Étant donné que le curseur n'a plus les verrous que vous avez demandés, Oracle doit fermer le curseur car il ne peut plus satisfaire le for update clause. La deuxième extraction doit donc renvoyer 0 lignes.

L'approche la plus logique serait presque toujours de supprimer le commit et faire le tout en une seule transaction. Si vous avez vraiment, vraiment, vraiment besoin de transactions séparées, vous devrez ouvrir et fermer le curseur à chaque itération de la boucle. Très probablement, vous voudriez faire quelque chose pour restreindre le curseur pour ne renvoyer que 100 lignes à chaque fois qu'il est ouvert (c'est-à-dire un rownum <= 100 clause) afin que vous n'encourriez pas les frais de visite de chaque ligne pour placer le verrou, puis de chaque ligne autre que les 100 que vous avez traitées et supprimées pour libérer le verrou à chaque fois dans la boucle.