2011-10-27 61 views
10

私は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 

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

答えて

23

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

これを回避するには、パッケージを使用した可能性のあるセッションを切断するか、セッションでDBMS_SESSION.RESET_PACKAGEを実行してパッケージの状態をリセットする必要があります。

+1

ありがとうdarreljnz、解決策は私のために正常に働いた。しかし、最初はあなたが何をしているのか分からなかった。だから、私はあなたのソリューションを他の人に少し明確にするつもりです。 pl/sqlで新しいテストウィンドウを開き、 "Begin sys.dbms_session.reset_package; end;を貼り付けます。 F9キーを押して実行してからパッケージを変更するか、パッケージを再コンパイルしてください。今度はアプリケーションでエラーが発生しません –

+1

この問題の解決策のベストスタートです。コアの問題とエラーがなぜ発生するのかを説明するために、これをもう少し詳しく見ていただければ幸いです。 –

+0

@YogeshJindalあなたはダレリンジとは違う何かを言っているようです。彼は、エラーを避けるためにパッケージを変更した後、RESET_PACKAGEを各セッションで実行する必要があると書いています。 – pauloya

4

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

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

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

3

あなたはパッケージとその本体にpragma serially_reusableを使用してください。

+1

これは何ですか、なぜこれが解決策ですか?詳しく教えてください – TecHunter

関連する問題