2012-06-14 22 views
9

パッケージに状態があるのか​​、状態がないのかを判断する方法はありますか。私は、その情報を含むデータ・ディクショナリ内のビューを認識していません。パッケージにOracleの状態があるかどうかを判断する方法はありますか?

「ORA-04068:パッケージの既存の文字列が破棄されました」というエラーは、むしろ迷惑です。これは、パッケージからパッケージ変数を削除することで無くすことができます。 11gでは、すべてのコンパイル時定数である変数を持つパッケージはステートレスとして扱われるという特徴が導入されました。

私は2つのセッションを持ち、1つのパッケージをコンパイルして、別のセッションで呼び出すと、例外をスローするかどうかを確認できますが、パッケージ内のプロシージャを呼び出す必要があります。

+1

を私が答える前に、あなたが知りたい理由を説明することができますか?あなたがしたいことを正確に理解しようとするだけで、苦痛にならないようにしようとしています。パッケージに状態があるかどうかを知ることが重要なのはなぜですか?また、パッケージに状態があるかどうか知りたいだけで、ある時点でORA-4068に遭遇する可能性がありますか?または、ステートフルパッケージの場合、パッケージの現在の状態が有効か無効か、または初期化されていないかどうかを知りたいですか? –

+3

セッションが開いている間に変更が加えられると、ユーザーにエラーが発生する可能性があるため、ステートフルなパッケージは煩わしいことがあります。私はステートレスにするためにリファクタリングしたパッケージ(これは将来のSO質問の話題になります)にこの問題があります。したがって、パッケージがステートレスかどうかを簡単に知ることができればいいですない。また、データベース内の他のどのパッケージがステートフルであり、潜在的にこの問題を引き起こす可能性もあります。 – eaolson

答えて

11

これは、潜在的に状態を持つ可能性のあるすべてのパッケージをリストすることができるように思えます。

あなたが探しているのは、グローバル変数または定数を持つパッケージだけです。単一のパッケージの場合、これは検査によって非常に簡単です。スキーマ内のすべてのパッケージ全体で検索するには、しかし、あなたがPL /適用範囲を使用することができます。

まず、あなたのセッションでPL /適用範囲をオンにし、スキーマの所有者としてログインします。

alter session set plscope_settings='IDENTIFIERS:ALL'; 

その後、再コンパイルすべてのパッケージ本体。

続いて、パッケージレベルで宣言されているすべての変数と定数見つけるために、このクエリを実行します。

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type in ('VARIABLE','CONSTANT') 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 

私はパッケージの結果リストは、あなたのターゲットになることをお勧めしたいの。

あなたが11gR2のにしている場合は、定数は、もはやあなたの代わりにこのクエリを使用すると思いますので、この問題が発生しない:

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type = 'VARIABLE' 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 
+0

それは私が探しているものではありません。 11gでは、すべての 'CONSTANT'パッケージ変数を持つパッケージはステートレスと見なされますが、クエリで返されます。 – eaolson

+0

eaolson、それは間違いです。 11gR1では、定数はパッケージに状態を持たせます。これは11gR2で修正されました。私はこれに注意するために質問を編集しました。 –

+0

うん、これは動作します! – eaolson

関連する問題