Não vá lá.
ORA-04091: table XXXX is mutating
geralmente é um bom indicador de que o que você está tentando fazer é muito complexo para ser feito de forma confiável com gatilhos. Claro, você pode usar uma variável de matriz de pacote e um punhado de gatilhos ( ah!) para contornar esse erro, mas seu código provavelmente:
- ser insustentável devido à sua complexidade e à natureza imprevisível dos acionadores
- não respondem bem a um ambiente multiusuário
É por isso que você deve repensar sua abordagem quando encontrar esse erro. Eu aconselho você a construir um conjunto de procedimentos bem agrupados em um pacote para lidar com a consistência entre linhas. Revogue todos os privilégios para fazer DML na tabela diretamente e use apenas esses procedimentos para modificá-la.
Por exemplo, seu procedimento de atualização seria um atômico processo que seria:
- adquira um bloqueio para evitar atualizações simultâneas no mesmo grupo de linhas (por exemplo, bloqueie o registro do quarto em um aplicativo de reserva de hotel).
- verifique se a linha a ser inserida valida toda a lógica de negócios
- criar todos os DML relevantes
- reverte todas as suas alterações (e apenas suas alterações -- não toda a transação) em caso de erro (fácil com PL/SQL, basta gerar um erro).