Problem polega na tym, że próbujesz pobrać po zatwierdzeniu.
Po otwarciu My_Data_Cur
z for update
klauzula, Oracle musi zablokować każdy wiersz w My_Data_1
tabeli, zanim zwróci jakiekolwiek wiersze. Kiedy commit
, Oracle musi zwolnić wszystkie te blokady (blokady tworzone przez Oracle nie obejmują transakcji). Ponieważ kursor nie ma już żądanych blokad, Oracle musi zamknąć kursor, ponieważ nie może już spełniać wymagań for update
klauzula. Dlatego drugie pobieranie musi zwrócić 0 wierszy.
Najbardziej logicznym podejściem byłoby prawie zawsze usunięcie commit
i zrób wszystko w jednej transakcji. Jeśli naprawdę, naprawdę, naprawdę potrzebujesz oddzielnych transakcji, musiałbyś otwierać i zamykać kursor dla każdej iteracji pętli. Najprawdopodobniej chciałbyś zrobić coś, aby ograniczyć kursor do zwracania tylko 100 wierszy za każdym razem, gdy jest otwierany (tj. rownum <= 100
klauzuli), aby nie ponosić kosztów odwiedzania każdego wiersza w celu umieszczenia blokady, a następnie każdego wiersza innego niż 100, który został przetworzony i usunięty, aby zwolnić blokadę za każdym razem w pętli.