Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

coleta em massa usando para atualização


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.