web-dev-qa-db-ja.com

パッケージの既存の状態は破棄されました

そのため、PLSQLプロシージャを問題なく実行し、エラーなしでコンパイルしています。プロシージャに1つの変更を加えましたが、それでも正常にコンパイルされますが、実行すると次のエラーが発生します。

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP"
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP"
ORA-06512: at "SCHEMA.XP_ST_002180", line 141
ORA-06512: at line 1

これが何であるかについてのアイデアはありますか?私が行った変更は非常に重要ではなかったため、このエラーが発生した可能性はないと思います。よろしくお願いします!

16
Dan

セッションがパッケージを使用する場合、そのセッションはパッケージの状態を保持します。次回同じセッションがパッケージを参照するときにそのパッケージが再コンパイルされると、そのエラーが発生します。

これを回避するには、パッケージを使用した可能性のある各セッションを切断するか、セッションにDBMS_SESSION.RESET_PACKAGEを実行させてパッケージの状態をリセットしてください。

29
darreljnz

パッケージ仕様を再コンパイルすると、すべての依存オブジェクトが無効になります。依存オブジェクトは、再コンパイルされたパッケージ仕様の宣言のいずれかを参照するビュー、パッケージ仕様、パッケージ本体、関数、またはプロシージャです。

また、darreljnzが指摘しているように、セッションは通常、アクセスしたパッケージの状態への参照を保持し、次にセッションがパッケージを参照しようとしたときにORA-04068: existing state of packages has been discardedを引き起こします。

この後者の動作は非常に厄介であり、操作を再試行するコードを作成するか、新しいバージョンのパッケージをインストールした後(アプリケーション/サービスを効果的に再起動)にすべてのアクティブなセッションを閉じる必要があります。結論:修正プログラムのインストールが難しくなります。

5
Klas Lindbäck

使用する pragma serially_reusableパッケージとその本体。

4
ThePallav_Abhi