Die wahrscheinlichste Ursache für einen mutierenden Tabellenfehler ist der Missbrauch von Triggern. Hier ist ein typisches Beispiel:
- Sie fügen eine Zeile in Tabelle A ein
- Ein Trigger für Tabelle A (für jede Zeile) führt eine Abfrage für Tabelle A aus, um beispielsweise eine Zusammenfassungsspalte zu berechnen
- Oracle löst einen ORA-04091 aus: Tabelle A mutiert, Trigger / Funktion sehen ihn möglicherweise nicht
Dies ist ein erwartetes und normales Verhalten. Oracle möchte Sie vor sich selbst schützen, da Oracle Folgendes garantiert:
- (i) dass jede Anweisung atomar ist (dh entweder fehlschlägt oder vollständig erfolgreich ist)
- (ii) dass jede Aussage eine konsistente Sicht auf die Daten sieht
Wenn Sie diese Art von Trigger schreiben, erwarten Sie höchstwahrscheinlich, dass die Abfrage (2) die Zeile sieht, die in (1) eingefügt wurde. Dies steht im Widerspruch zu beiden obigen Punkten, da die Aktualisierung noch nicht abgeschlossen ist (es könnten weitere Zeilen eingefügt werden).
Oracle konnte das Ergebnis in Übereinstimmung mit einem Zeitpunkt unmittelbar vor dem Beginn der Anweisung zurückgeben, aber aus den meisten Beispielen, die ich gesehen habe, um diese Logik zu implementieren, sehen die Leute eine mehrzeilige Anweisung als eine Reihe aufeinanderfolgender Schritte und erwarten die Anweisung [2], um die durch die vorherigen Schritte vorgenommenen Änderungen anzuzeigen. Oracle kann das erwartete Ergebnis nicht zurückgeben und löst daher den Fehler aus.
Zum weiterlesen: "mutating table" auf Ask Tom .
Wenn, wie ich vermute, die Ursache des Fehlers in der mutierenden Tabelle ein Trigger ist, besteht eine Möglichkeit, den Fehler zu vermeiden, darin, die Logik aus dem Trigger in Prozeduren zu verschieben.