Наиболее вероятной причиной ошибки таблицы мутаций является неправильное использование триггеров. Вот типичный пример:
- Вы вставляете строку в таблицу A
- триггер для таблицы A (для каждой строки) выполняет запрос к таблице A, например, для вычисления итогового столбца
- Oracle выдает ORA-04091: таблица A мутирует, триггер / функция может ее не видеть
Это ожидаемое и нормальное поведение, Oracle хочет защитить вас от себя, поскольку Oracle гарантирует:
- (i) что каждое утверждение является атомарным (то есть либо потерпит неудачу, либо завершится успешно)
- (ii) что каждое утверждение видит последовательное представление данных
Скорее всего, когда вы напишите триггер такого типа, вы ожидаете, что запрос (2) увидит строку, вставленную в (1). Это противоречило бы обоим пунктам выше, поскольку обновление еще не закончено (может быть добавлено больше строк).
Oracle может вернуть результат в соответствии с моментом времени непосредственно перед началом оператора, но из большинства примеров, которые я видел, пытаясь реализовать эту логику, люди рассматривают многострочный оператор как серию последовательных шагов и ожидают, что оператор [2], чтобы увидеть изменения, сделанные в предыдущих шагах. Oracle не может вернуть ожидаемый результат и поэтому выдает ошибку.
Для дальнейшего чтения: «Стол для мутаций» на Ask Tom .
Если, как я подозреваю, причиной ошибки таблицы мутаций является триггер, один из способов избежать ошибки - переместить логику из триггера в процедуры.