web-dev-qa-db-ja.com

Oracle ORA-04068で頻繁に発生するエラー:パッケージの既存の状態が破棄されました

このエラーは、2時間ごとに実行されるスクリプトで、1日の異なる時間に1日1回発生します。

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "PACKAGE.NAME" has been
invalidated
ORA-06508: PL/SQL: could not find program unit being called:
"PACKAGE.NAME"
ORA-06512: at line 1

調査できるように、誰かがこのエラーの原因となる可能性のある条件をリストできますか?

ありがとう。

更新:'ALTER SESSION CLOSE DATABASE LINK DBLINK'を実行すると、パッケージの状態が無効になりますか?

11
jonasespelita

このワンライナーは実際にすべてを解決しました:

PRAGMA SERIALLY_REUSABLE;

問題を回避するために、グローバル変数がステートレスであることを確認してください。

15
jonasespelita

パッケージにはパブリック変数またはプライベート変数があります。 (そうですか?)この変数は、パッケージの状態を形成します。 3番目のセッションでパッケージをコンパイルする場合。このパッケージへの次のアクセスはORA-04068をスローします。

パッケージのビルドタイムスタンプは、パッケージセッションの状態よりも古い必要があります。

スクリプトの実行にパッケージの状態が必要ない場合は、スクリプトの先頭でDBMS_SESSION.RESET_PACKAGEを呼び出します。これにより、セッションのすべてのパッケージ状態がクリーンアップされます。

16
Christian13467

dba_dependenciesまたはuser_dependenciesを確認することもできます。

select *
from dba_dependencies
where name = 'YOUR_PACKAGE'
and type = 'PACKAGE' --- or 'PACKAGE_BODY'
and owner = USER --- or USERNAME

これにより、パッケージが依存しているオブジェクトが得られます。そこで何が起こっているかを確認してください。

5
Guru

この問題は数回発生しており、当面の間、この問題を一時的に解決するためにスキーマをコンパイルしていました。数日にわたって、私たちは恒久的な解決策を探していました。

同義語のタイムスタンプの違いを示すクエリを以下に見つけました。同義語を再コンパイルし、機能しました!!!ほぼ1週間が経ちましたが、今のところ問題はありません。これが私たちの場合に役立ったクエリです。

****

select do.obj# d_obj,do.name d_name, do.type# d_type, po.obj# p_obj,po.name p_name,
to_char(p_timestamp,'DD-MON-YYYY HH24:MI:SS') "P_Timestamp",
to_char(po.stime ,'DD-MON-YYYY HH24:MI:SS') "STIME", 
decode(sign(po.stime-p_timestamp),0,'SAME','*DIFFER*') X 
from sys.obj$ do, sys.dependency$ d, sys.obj$ po
where P_OBJ#=po.obj#(+) and D_OBJ#=do.obj# 
and do.status=1 /*dependent is valid*/ 
and po.status=1 /*parent is valid*/ 
and po.stime!=p_timestamp /*parent timestamp not match*/ 
order by 2,1;

****

これがこの問題を抱えている可能性のある人に役立つことを願っています。

2
VRK

オブジェクトに変更を加えて、他のオブジェクトを無効にしているようです。たとえば、インデックスを削除すると、そのテーブルに依存するすべてのパッケージが無効な状態になる可能性があります。カスケード効果があります。パッケージが無効な場合、パッケージに依存する関数と関数を使用するビューが無効になる可能性があります。すべてのDDLクエリの後に、すべてのオブジェクトを再コンパイルしてみてください。

0
borjab