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

Rollback na exceção PLSQL


Primeiro, estou assumindo que podemos ignorar os erros de sintaxe (por exemplo, não há END LOOP , o dbms_output.put_line está faltando a primeira aspa simples, etc.)

Quanto à necessidade de reverter as alterações, depende.

Em geral, você não teria commits temporários em um loop. Essa é geralmente uma arquitetura ruim porque é muito mais cara em termos de E/S e tempo decorrido. Também torna muito mais difícil escrever código reiniciável. O que acontece, por exemplo, se o seu SELECT instrução seleciona 10 linhas, você emite (e confirma) 5 atualizações e, em seguida, a 6ª atualização falha? A única maneira de poder reiniciar com a 6ª linha depois de corrigir a exceção seria ter uma tabela separada onde você armazenou (e atualiza) o progresso do seu código. Isso também cria problemas para qualquer código que chame esse bloco, que tem que lidar com o caso de metade do trabalho ter sido feito (e confirmado) e a outra metade não.

Em geral, você só colocaria instruções de controle de transação nos blocos mais externos do seu código. Como um COMMIT ou um ROLLBACK em um procedimento confirma ou reverte qualquer trabalho feito na sessão, seja ou não feito pelo procedimento, você deve ser muito cauteloso ao adicionar instruções de controle de transação. Geralmente, você deseja deixar o chamador decidir se deve confirmar ou reverter. Claro, isso só vai até certo ponto - eventualmente, você estará no bloco mais externo que nunca será chamado de alguma outra rotina e você precisa ter controle de transação apropriado - mas é algo para ser muito cauteloso sobre se você está escrevendo código que pode ser reutilizado.

Nesse caso, como você tem commits temporários, o único efeito do seu ROLLBACK seria que, se a primeira instrução de atualização falhasse, o trabalho que havia sido feito em sua sessão antes de chamar este bloco seria revertido. O commit temporário confirmaria essas alterações anteriores se a primeira instrução de atualização fosse bem-sucedida. Esse é o tipo de efeito colateral com o qual as pessoas se preocupam quando falam sobre por que os commits temporários e o controle de transações em blocos reutilizáveis ​​são problemáticos.