AUTONOMOUS_TRANSACTION
Podemos nos deparar em situações em que não podemos permitir que chamadas a funções, procedures ou triggers rodem na mesma transaction, intervindo assim em commits e rollbacks. Antes de mostrar um exemplo, criem a seguinte tabela.
CREATE TABLE exemplo(
numero NUMBER
);
Vejamos um exemplo clássico agora.
Veja que na linha 7, na procedure, temos um commit após inserir 5 linhas, os números de 6 à 10.
Temos um bloco anônimo, nas linhas 11 à 17. Nesse bloco, no seu início, inserimos mais 5 linhas, os números 1 à 5. Após inserir essas linhas é feita a chamada a procedure, que logo depois é feito um rollback na linha 16. Qual será o resultado? Quais as linhas existentes na tabela? O resultado é que nada foi feito o rollback, todas as 10 linhas sofreram commit. Talvez o desejado fosse que as linhas de 1 à 5 fosse feito o rollback, mas isto não aconteceu. Acontece que a chamada a procedure acontece tudo na mesma transaction do bloco anônimo. Para resolver isto, caso seja o desejado, devemos utilizar o AUTONOMOUS_TRANSACTION. Veja como ficaria.
Agora o commit feito na stored procedure não afeta o que acontece na transaction atual, no bloco anônimo. As linha inseridas na procedura, os números de 6 à 10, sofreram o commit, mas não as linhas de 1 à 5 que sofreram um rollback.
Referências
- Oracle 12c SQL Reference
- Autotransaction Pragma
- Autonomous transaction
Abraço
Otima explicaçao !