Oracle オブジェクトを一括で再コンパイルする方法

Oracleのオブジェクト、PROCEDUREやFUNCTION、PACKAGEやVIEWなどを一括で再コンパイルする方法です。

Oracle オブジェクトを一括で再コンパイルする方法

無効(INVALID)になったオブジェクトは使用するときに自動的に再コンパイルされますが、Oracleのエクスポート・インポートの後やリンク先のオブジェクトがコンパイルされた時など、どうしても手動で再コンパイルが必要となる場面があります。

一括で再コンパイルするスクリプトにしておけば、どの環境でも利用できるので便利です。オブジェクトタイプやオブジェクト名の指定もできるので、再コンパイルされると困るオブジェクトは避けることもできます。

まあ、オブジェクトを一括で再コンパイルするような場面は少ないけど、あったらいいなって感じのものですかね。

ここでは Oracleオブジェクトを一括で再コンパイルするスクリプト を紹介します。


コンパイルできるオブジェクト

コンパイルできるスキーマオブジェクトは以下の通りです。

  • DIMENSION
  • FUNCTION
  • INDEXTYPE
  • JAVA
  • MATERIALIZED VIEW / SNAPSHOT
  • OPERATOR
  • PACKAGE
  • PACKAGE BODY
  • PROCEDURE
  • TRIGGER
  • TYPE
  • VIEW

一括で再コンパイルするスクリプト

Oracleオブジェクトを一括で再コンパイルするには、「ALTER COMPILE」を使います。「EXECUTE IMMEDIATE」で実行します。EXECUTE IMMEDIATEは、動的SQL(SQL文を変数で作成)を実行するために利用するものです。

例えば、PROCEDUREの再コンパイルを一括実行するコードはこうなります。

BEGIN
  FOR cur IN (
    SELECT
     object_name
    ,object_type
    FROM user_objects
    WHERE object_type = 'PROCEDURE'
    AND status = 'INVALID'
  )
  LOOP
    DBMS_OUTPUT.PUT_LINE(cur.object_name);
    EXECUTE IMMEDIATE 'ALTER ' || cur.object_type || ' ' || cur.object_name || ' COMPILE';
  END LOOP;
END;

「object_type = 'PROCEDURE'」の部分を、PACKAGEやFUNCTIONに変更すればそれらのオブジェクトのみ再コンパイルされます。指定を外せば全オブジェクトが再コンパイルされます。

また、「object_name」を指定すれば特定のオブジェクトだけを再コンパイルすることが可能です。

この中でPACKAGEだけはちょっと特殊です。もしヘッダとボディを個別にコンパイルしたい場合には下記のコードを実行します。

ALTER PACKAGE package_name COMPILE PACKAGE;--ヘッダ
ALTER PACKAGE package_name COMPILE BODY;--ボディ

PACKAGE と PACKAGE BODY の両方をコンパイルするなら下記のコードでOKです。

ALTER PACKAGE package_name COMPILE;

まとめ

Oracleのオブジェクト、PROCEDUREやFUNCTION、PACKAGEやVIEWなどを一括で再コンパイルする方法を紹介しました。

今回紹介したスクリプトは、オブジェクトを保有しているユーザーであれば環境を問わず実行可能です。

UTL_RECOMPパッケージを使う方法があるけど、スキーマ単位であったり、SYSDBAで接続する必要があったりと、ちょっと敷居が高いので私は使ってません^^;

EXECUTE UTL_RECOMP.RECOMP_SERIAL('schema_name');

皆さんも色々と試してみてください。また、使い方を忘れたらこのサイトを訪れてくださいね。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。