2

内部でいくつかのプロシージャを呼び出すラッパー プロシージャ (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 つの異なる呼び出しとして分離できることはわかっています。また、オラクルは次回実行する前にプロシージャをコンパイルしようとするため、これは表面的なステップであることも認識しています。したがって、無効はとにかく有効になります。しかし、その日の処刑が終わると、それらはすべて無効な状態にあり、それを回避できるかどうか権力者から質問されます!

したがって、呼び出しを分離せずにメイン プロシージャの最後のステップとして保持できるかどうかを知りたかっただけです。

どんな考え/指針も大歓迎です。

4

2 に答える 2

6

動的 SQLを使用して依存関係を解消できます。

CREATE OR REPLACE PROCEDURE proc_main AS
BEGIN

   EXECUTE IMMEDIATE 'BEGIN proc_child1; END;';

   EXECUTE IMMEDIATE 'BEGIN proc_child2; END;';

   EXECUTE IMMEDIATE 'BEGIN proc_child3; END;';

   proc_compile_invalids;  -- This invokes 
                           -- "alter procedure <procedure_name> compile" 
                           -- statement for all the invalids.

END;
于 2012-09-13T15:33:49.513 に答える
3

Oracle 11g 以降

メイン プロシージャの代わりにdbms_utilityパッケージcompile_schemaのプロシージャを使用して、指定したスキーマ内のすべての無効なプロシージャ、関数、パッケージ、およびトリガーを再コンパイルできます。proc_compile_ivalids

create or replace Procedure proc_main
as
begin
  Proc_child1;
  proc_child2;
  proc_child3;
  dbms_utility.compile_schema(schema, false);
end;
于 2012-09-13T15:59:28.790 に答える