A causa mais provável de um erro de tabela mutante é o uso indevido de gatilhos. Aqui está um exemplo típico:
- você insere uma linha na tabela A
- um gatilho na tabela A (para cada linha) executa uma consulta na tabela A, por exemplo, para calcular uma coluna de resumo
- O Oracle lança um ORA-04091: a tabela A está em mutação, o gatilho / função pode não vê-lo
Esse é um comportamento esperado e normal. A Oracle deseja protegê-lo de si mesmo, pois a Oracle garante:
- (i) que cada afirmação é atômica (ou seja, falhará ou terá êxito completo)
- (ii) que cada declaração tenha uma visão consistente dos dados
Provavelmente, ao escrever esse tipo de gatilho, você esperaria que a consulta (2) visse a linha inserida em (1). Isso estaria em contradição com os dois pontos acima, já que a atualização ainda não foi concluída (pode haver mais linhas a serem inseridas).
A Oracle poderia retornar o resultado consistente com um ponto no tempo imediatamente antes do início da declaração, mas, na maioria dos exemplos que já vi que tentam implementar essa lógica, as pessoas veem uma declaração com várias linhas como uma série de etapas sucessivas e esperam o declaração [2] para ver as alterações feitas nas etapas anteriores. O Oracle não pode retornar o resultado esperado e, portanto, gera o erro.
Para leitura adicional: "tabela mutante" em Ask Tom .
Se, como suspeito, a causa do erro da tabela de mutação for um gatilho, uma maneira de evitar o erro é mover a lógica do gatilho para os procedimentos.