そこに行かないでください。
ORA-04091: table XXXX is mutating
一般的に、あなたがやろうとしていることは複雑すぎて確実に実行できないことを示す良い指標です。 トリガー付き。
もちろん、パッケージ配列変数といくつかのトリガー(うーん!) このエラーを回避するために、しかしあなたのコードはおそらく:
- その複雑さとトリガーの予測不可能な性質のために、保守不可能である
- マルチユーザー環境にうまく反応しない
このため、このエラーが発生した場合は、アプローチを再考する必要があります。行間の一貫性に対処するために、パッケージに適切にグループ化された一連のプロシージャを構築することをお勧めします。テーブルを直接DMLするためのすべての特権を取り消し、それらのプロシージャのみを使用してテーブルを変更します。
たとえば、更新手順はアトミックになります 次のようなプロセス:
- 同じ行グループでの同時更新を防ぐためにロックを取得します(たとえば、ホテル予約アプリケーションで部屋のレコードをロックします)。
- 挿入する行がすべてのビジネスロジックを検証することを確認します
- 関連するすべてのDMLを作成する
- エラーが発生した場合は、すべての変更をロールバックします(そして、トランザクション全体ではなく、変更のみをロールバックします)(PL / SQLで簡単に、エラーを発生させるだけです)。