Top > PLSQL プログラミング入門(1) > プロシージャのコンパイル

プロシージャのコンパイル

ストアドプロシージャ、パッケージは通常、登録作成時や呼び出し時に自動的にコンパイルされるため手動でコンパイルする必要はない。
ただし、プログラムを変更したことによって他のプログラムに影響を与える場合にはコンパイルをしておいた方が良い。

例えばプロシージャのコンパイルは

ALTER PROCEDURE procedure_name COMPILE;

という ALTER object_type object_name COMPILE というコマンドにて行なうことができる。

このコンパイルという作業は、ビューやシノニムなどにも実行することができる。

全コンパイル

多くのプロシージャや定義を変更した後に、1つ1つのオブジェクトを再コンパイルするのは面倒なので全部コンパイルするというパッケージがちゃんと用意されている。

UTL_RECOMP Oracle 10g

Oracle 10g から登場した、この UTL_RECOMP パッケージにより前からある DBMS_UTILITY.COMPILE_SCHEMA というのもあるにはある。
しかし、経験上依存関係のネストが深くなったりするとコンパイルを途中放棄してしまったりすることもあったので、自前のコンパイルのストアドプロシージャを作成していた人が多いのではないだろうか(※1)。
またコンパイル対象は「プロシージャ、ファンクション、パッケージおよびトリガー」となっている。つまり… Oracle 10g であれば DBMS_UTILITY.COMPILE_SCHEMA より UTL_RECOMP パッケージを使用する方が良い。

とはいえ、UTL_RECOMP の実行には幾つかの前提事項があるので気をつける必要がある。

  • SQL*Plus で実行すること
  • 接続は SYSDBA で行なうこと (conn / as sysdba など)

後は一般的なインストール状態では問題にならないはずであるが

  • コンパイル作業は JOB を使用するので JOBキューが使える状態であること
  • STANDARD (standard.sql)、DBMS_STANDARD (dbmsstdx.sql)、DBMS_JOB (dbmsjob.sql)、DBMS_RANDOM (dbmsrand.sql) が使用できる状態であること

UTL_RECOMP パッケージは 以下のように実行する。(シリアル実行の場合)

SQL> conn / as sysdba
SQL> CALL UTL_RECOMP.RECOMP_SERIAL('schema_name'); // (※2) 
または
SQL> EXECUTE UTL_RECOMP.RECOMP_SERIAL('schema_name');
または、…
SQL> EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('schema_name');

(※1) 作成例 旧 OTN Code Tips (http://otn.oracle.co.jp/otn_pl/otn_tool/code_detail?n_code_id=1103 )

(※2) スキーマ名を省略すると、全スキーマを対象に INVALID なオブジェクトをコンパイルする。

実行後には以下の SQL で INVALID なオブジェクトがない事も確かめておくと良い。

SELECT owner, object_type, status, object_name
  FROM all_objects
 WHERE status = 'INVALID';

ALTER COMPILE に関する豆知識

ビューシノニムを再コンパイルするというのは参照元のテーブルなどが再作成されたことによって以前と違うものに 置き換えられてる可能性があるために再チェックするということである。

例えばテーブルから項目が削除された場合にビューも再定義し直さないといけない場合もある。 シノニムの場合にも以前はテーブルだったものがプロシージャになっているケースもあり得る。

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

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

この中で PACKAGE と PACKAGE BODY のコンパイルは

ALTER PACKAGE package_name COMPILE PACKAGE;
と
ALTER PACKAGE package_name COMPILE BODY;

という記述にて行なう。

なお

ALTER PACKAGE package_name COMPILE;

を行なうと PACKAGE と PACKAGE BODY の両方をコンパイルする。

 


プロシージャのコンパイルの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター