質問

この質問を作成したシナリオ:

別のパッケージの依存関係であるパッケージがあり、「親」に変更を加えることがあります。パッケージは依存パッケージを無効にしますが、そうでない場合もあります。

以前は驚きました。

無効化の原因を簡単に理解しておくと、予測/計画できるようになります。

役に立ちましたか?

解決

パッケージが依存するオブジェクト(テーブル、ビュー、トリガー、その他のパッケージなど)を変更すると、パッケージは自動的に無効としてマークされます。 tuinstoelが上記で述べているように、Oracleはパッケージを最初に使用するときに再コンパイルするのに十分スマートです。

これについて懸念がある場合は、スキーマの変更(テーブル、ビュー、トリガー、プロシージャなど)を行うたびに、 DBMS_UTILITY.compile_schema を実行します(またはDBAに実行させます)。これにより、すべてのパッケージが強制的にコンパイルされ、エラーを見つける前にどこに、またはエラーがあるかがわかります。

他のヒント

または、次の表を照会して、どの依存関係があるかを確認できます

   select *
   from dba_dependencies
   where name = 'YOUR_PACKAGE'
   and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
   and owner = USER --- Or can be set to any user

これにより、すべての依存関係が表示されます。オブジェクトに対してuser_dependenciesをクエリします。

ところで、もし私が状況について完全に間違っているなら...前もって謝罪します

驚いたことは?

その意味がわからない...

本番環境で何かが壊れましたか?

正確に何が起こったのですか?

私が尋ねる理由は、起こり得るあらゆる変化の影響を理解することは、結果を処理するよりもはるかに難しいからです。無効化が問題になるのはなぜですか?私の推測では、「パッケージの既存の状態は破棄されました」と表示されたためです。アプリケーションのエラー。それは REAL の問題ですか?

再びそうだと思うので、もしそうなら、コメントに入れたバージョン固有の変更のリストの代わりに、それを処理しましょう。 (たとえば、11gはテーブル全体ではなくテーブルの列までの依存関係を追跡します。)

これは、パッケージの状態を使用していない場合は 、重要なエラーとは思われないかもしれません。もしあなたがこれが重要なエラーであり、あなたが驚いていないなら、私はあなたがそうではないと推測しています。

あなたではないので、このエラーは無視しても構いません。安全に無視できるので、他の人が指摘したように、Oracleがパッケージを再コンパイルするため、このエラーを無視して呼び出しを再試行するようにクライアントアプリをコーディングできます。これは価値のある練習です。変更を行うときに心配する必要があるすべての可能性を知るのではなく、緊急修正でそれらのいずれかを忘れるのではなく、アプリが心配することなくそれを処理して先に進むためです。

Thomas Jones-Lowには同意しますが、長時間のセッションと再コンパイルにはさらに2つの問題があります。

セッションでパッケージを参照し、そのパッケージ(または依存パッケージ)が同じセッション中に再コンパイルされると、Oracleエラー「ORA-06508:PL / SQL:呼び出されるプログラムユニットが見つかりませんでした」が表示されます;

セッションでパッケージを参照すると、通常はそのセッションでパッケージを無効にしない限りパッケージを変更できません。これは、パッケージが頻繁に変更される開発環境では特に問題ですが、環境全体をダウンさせることなく小さなパッチを適用する実稼働環境でも問題です。変更されたパッケージにエラーがない場合でも、このエラーが発生することに注意してください。

Thomas Jones-Lowの答えに加えて、パッケージBODYのみを変更すると、依存オブジェクトが無効としてマークされない場合があります。

ただし、パッケージの仕様を変更すると、すぐにそれが発生します。

無効なOracleパッケージを実行しようとすると、Oracleはそれをコンパイルしようとします。 Oracleのコンパイル後に無効のままになっている場合のみ、例外がスローされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top