Проблемът е, че се опитвате да направите извличане през комит.
Когато отворите My_Data_Cur
с for update
клауза, Oracle трябва да заключи всеки ред в My_Data_1
таблица, преди да може да върне редове. Когато commit
, Oracle трябва да освободи всички тези заключвания (ключалките, които Oracle създава, не обхващат транзакции). Тъй като курсорът вече няма ключалки, които сте поискали, Oracle трябва да затвори курсора, тъй като вече не може да удовлетвори for update
клауза. Следователно второто извличане трябва да върне 0 реда.
Най-логичният подход почти винаги би бил премахването на commit
и направете всичко с една транзакция. Ако наистина, наистина, наистина се нуждаете от отделни транзакции, ще трябва да отваряте и затваряте курсора за всяка итерация на цикъла. Най-вероятно ще искате да направите нещо, за да ограничите курсора да връща само 100 реда при всяко отваряне (т.е. rownum <= 100
клауза), така че да не поемате разходите за посещение на всеки ред, за да поставите ключалката и след това всеки ред, различен от 100-те, които сте обработили и изтрили, за да освободите ключалката всеки път през цикъла.