Problém je v tom, že se pokoušíte provést načtení přes odevzdání.
Když otevřete My_Data_Cur
pomocí for update
klauzule, Oracle musí uzamknout každý řádek v My_Data_1
tabulky, než může vrátit jakékoli řádky. Když se commit
, Oracle musí uvolnit všechny tyto zámky (zámky vytvořené Oracle nezahrnují transakce). Protože kurzor již nemá zámky, které jste požadovali, Oracle musí kurzor zavřít, protože již nemůže splnit požadavek for update
doložka. Druhé načtení proto musí vrátit 0 řádků.
Nejlogičtějším přístupem by téměř vždy bylo odstranění commit
a provést celou věc v jediné transakci. Pokud opravdu, opravdu, opravdu potřebujete samostatné transakce, budete muset otevřít a zavřít kurzor pro každou iteraci cyklu. S největší pravděpodobností budete chtít udělat něco, co omezí kurzor tak, aby při každém otevření vrátil pouze 100 řádků (tj. rownum <= 100
klauzule), abyste nemuseli platit náklady na navštěvování každého řádku za účelem umístění zámku a poté každého jiného řádku než těch 100, které jste zpracovali a odstranili, abyste zámek uvolnili pokaždé, když projdete smyčkou.