O problema é que você está tentando fazer uma busca em um commit.
Quando você abre
My_Data_Cur
com o for update
cláusula, o Oracle precisa bloquear todas as linhas no My_Data_1
table antes que ela possa retornar qualquer linha. Quando você commit
, o Oracle precisa liberar todos esses bloqueios (os bloqueios que o Oracle cria não abrangem transações). Como o cursor não possui mais os bloqueios solicitados, o Oracle precisa fechar o cursor, pois ele não pode mais atender ao for update
cláusula. A segunda busca, portanto, deve retornar 0 linhas. A abordagem mais lógica seria quase sempre remover o
commit
e fazer tudo em uma única transação. Se você realmente precisa de transações separadas, precisa abrir e fechar o cursor para cada iteração do loop. Muito provavelmente, você gostaria de fazer algo para restringir o cursor para retornar apenas 100 linhas toda vez que for aberto (ou seja, um rownum <= 100
cláusula) para que você não incorra na despesa de visitar todas as linhas para colocar o bloqueio e, em seguida, todas as linhas diferentes das 100 que você processou e excluiu para liberar o bloqueio todas as vezes no loop.