これは、潜在的に状態を持つ可能性のあるすべてのパッケージをリストすることができるように思えます。
あなたが探しているのは、グローバル変数または定数を持つパッケージだけです。単一のパッケージの場合、これは検査によって非常に簡単です。スキーマ内のすべてのパッケージ全体で検索するには、しかし、あなたが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'
);
を私が答える前に、あなたが知りたい理由を説明することができますか?あなたがしたいことを正確に理解しようとするだけで、苦痛にならないようにしようとしています。パッケージに状態があるかどうかを知ることが重要なのはなぜですか?また、パッケージに状態があるかどうか知りたいだけで、ある時点でORA-4068に遭遇する可能性がありますか?または、ステートフルパッケージの場合、パッケージの現在の状態が有効か無効か、または初期化されていないかどうかを知りたいですか? –
セッションが開いている間に変更が加えられると、ユーザーにエラーが発生する可能性があるため、ステートフルなパッケージは煩わしいことがあります。私はステートレスにするためにリファクタリングしたパッケージ(これは将来のSO質問の話題になります)にこの問題があります。したがって、パッケージがステートレスかどうかを簡単に知ることができればいいですない。また、データベース内の他のどのパッケージがステートフルであり、潜在的にこの問題を引き起こす可能性もあります。 – eaolson