web-dev-qa-db-ja.com

「ORA-04068:パッケージの既存の状態は破棄されました。ORA-04065:ストアドプロシージャは実行、変更、または削除されていません。

プロシージャ「PROCEDURE_NAME」の下でプロシージャ「CALLING_PROCEDURE_NAME」を実行しようとすると、エラーが発生します。しかし、私のPROCEDURE_NAMEはすでに有効な状態にあり、他のいくつかの手順で正常に使用されています。

ORA-04068: existing state of packages has been discarded
ORA-04065: not executed, altered or dropped stored procedure ""PROCEDURE_NAME""
ORA-06508: PL/SQL: could not find program unit being called: ""PROCEDURE_NAME""
ORA-06512: at ""CALLING_PROCEDURE_NAME"", line LINE_NO
ORA-06512: at line 1
9
Tajinder

しかし、私のPROCEDURE_NAMEはすでに有効な状態にあり、他のいくつかの手順で正常に使用されています。

パッケージが現在呼び出されているセッションは、パッケージのその状態を保持します。パッケージを再コンパイルすると、パッケージがそのセッションで再度呼び出された瞬間に、このエラーが発生します。

  1. DBMS_SESSION.RESET_PACKAGE; を実行して、呼び出しを行ったPL/SQL呼び出しの実行が終了した後で、メモリ、カーソル、およびパッケージ変数を解放できます。

  2. 既存のセッションをすべて閉じて、再実行できます。

  3. PRAGMA SERIALLY_REUSABLE;ステートメントを使用して、パッケージ SERIALLY_REUSABLE Packages を作成できます。パッケージがSERIALLY_REUSABLEの場合、そのパッケージの状態は、システムグローバル領域(SGA)の小さなプール内の作業領域に格納されます。パッケージの状態は、サーバー呼び出しの存続期間中のみ持続します。

12
Lalit Kumar B