内部でいくつかのプロシージャを呼び出すラッパー プロシージャ (proc_main) があります。
create or replace Procedure proc_main
as
begin
proc_child1;
proc_child2;
proc_child3;
proc_compile_invalids; -- This invokes "alter procedure <procedure_name> compile" statement for all the invalids.
end;
/
proc_child プロシージャは、テーブルの名前を変更するためのいくつかの手順を含むいくつかの処理ロジックを適用します。
これにより、プロシージャが無効になります。これが、proc_compile_invalids プロシージャを使用して再度有効な状態に設定する理由です。
私の問題は、proc_main プロシージャを実行すると、メイン プロシージャと内部の子プロシージャが無効になることです。したがって、proc_compile_invalids が最後のステップとして呼び出されると、メインの呼び出しプロシージャを再コンパイルしようとしてハングします。
明らかに、最後のステップを削除して個別に実行しても問題ありません。
コンパイル プロシージャをコメント化し、それをスタンドアロンとして実行することで、それらを 2 つの異なる呼び出しとして分離できることはわかっています。また、オラクルは次回実行する前にプロシージャをコンパイルしようとするため、これは表面的なステップであることも認識しています。したがって、無効はとにかく有効になります。しかし、その日の処刑が終わると、それらはすべて無効な状態にあり、それを回避できるかどうか権力者から質問されます!
したがって、呼び出しを分離せずにメイン プロシージャの最後のステップとして保持できるかどうかを知りたかっただけです。
どんな考え/指針も大歓迎です。