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

だから、私は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

これはどんなアイデアですか?私が行った変更はそれほど重要ではなかったので、このエラーが発生した可能性は疑問です。ご協力いただきありがとうございます!

10

3 答え

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

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

23
追加された
@ YogeshJindalあなたはダレリンジとは違う何かを言っているようです。彼は、エラーを避けるためにパッケージを変更した後、RESET_PACKAGEを各セッションで実行する必要があると書いています。
追加された 著者 pauloya,
@YogeshJindal私が読んだのは、各セッションでこのコマンドを実行する必要があるということです。このコマンドは、コマンドの内容を読んだ後で意味があります。
追加された 著者 pauloya,
この問題の答えのベストスタート。コアの問題とエラーがなぜ発生するのかを説明するために、これをもう少し詳しく見ていただければ幸いです。
追加された 著者 Andrew Martinez,
ありがとうdarreljnz、ソリューションは私のために正常に働いた。しかし、最初はあなたが何をしているのか分からなかった。だから、私はあなたのソリューションを他の人に少し明確にするつもりです。 pl/sqlで新しいテストウィンドウを開き、 "Begin sys.dbms_session.reset_package; end;を貼り付けます。 F9キーを押して実行してからパッケージを変更するか、パッケージを再コンパイルすれば、アプリケーションでエラーは発生しません
追加された 著者 Yogesh Jindal,
@PauloManuelSantos彼は、すべてのセッションを切断するか、セッションからこのコマンドを実行してパッケージの状態をリセットすると言っていると思います。
追加された 著者 Yogesh Jindal,

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

また、darreljnzによって指摘されているように、セッションは通常、アクセスしたパッケージの状態への参照を保持しており、次回セッションが参照しようとしたときに ORA-04068:パッケージの既存状態は破棄されますパッケージ。

この後者の動作は真の厄介なものであり、新しいバージョンのパッケージをインストールした後(アプリケーション/サービスを実質的に再起動する)、操作を再試行するためのコードを書いたり、すべてのアクティブなセッションを閉じる必要があります。 結論:ホットフィックスをインストールするのが難しくなります。

4
追加された

パッケージとその本体で pragma serially_reusable を使用します。

3
追加された
それは何ですか、なぜこれが解決策ですか?詳しく教えてください
追加された 著者 TecHunter,