ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

OracleでVIEWやFUNCTIONを一括で再コンパイルする方法

データのインポートをした時に、他のオブジェクトが不足しているためにVIEWなどが有効にならないときがあります。
そういう場合は、VIEWなどを再コンパイルすることで使用可能になりますが、
1つずつ再コンパイルするSQLを流すのは非常に面倒くさいです。


それを一括で行う方法を紹介します。
やり方としては、オブジェクト情報を取得し、プログラム的にループでSQLを実行していくものです。
コンパイルが必要なものはuser_objectsテーブルのstatusがinvalidになっているものです。

事前準備


SQLPlusを起動し、再コンパイルしたいオブジェクトを保有しているユーザーでログインします。
出力の制限を上げるために次の設定を実行しておきます。

set serveroutput on size 10000;

一括コンパイルスクリプト


VIEW

begin
	for cur in (select object_name, object_type from user_objects where object_type = 'VIEW' and status = 'INVALID')
	loop
		dbms_output.put_line(cur.object_name);
		execute immediate 'alter ' || cur.object_type || ' ' || cur.object_name || ' compile';
	end loop;
end;
/


SYNONYM

begin
	for cur in (select object_name, object_type from user_objects where object_type = 'SYNONYM ' and status = 'INVALID')
	loop
		dbms_output.put_line(cur.object_name);
		execute immediate 'alter ' || cur.object_type || ' ' || cur.object_name || ' compile';
	end loop;
end;
/


FUNCTION

begin
	for cur in (select object_name, object_type from user_objects where object_type = 'FUNCTION' and status = 'INVALID')
	loop
		dbms_output.put_line(cur.object_name);
		execute immediate 'alter ' || cur.object_type || ' ' || cur.object_name || ' compile';
	end loop;
end;
/


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;
/


PACKAGE

begin
	for cur in (select object_name, object_type from user_objects where object_type = 'PACKAGE ' and status = 'INVALID')
	loop
		dbms_output.put_line(cur.object_name);
		execute immediate 'alter ' || cur.object_type || ' ' || cur.object_name || ' compile';
	end loop;
end;
/


全オブジェクト

begin
	for cur in (select object_name, object_type from user_objects where status = 'INVALID')
	loop
		dbms_output.put_line(cur.object_name);
		execute immediate 'alter ' || cur.object_type || ' ' || cur.object_name || ' compile';
	end loop;
end;
/

TABLE、SEQUENCEを一括で削除する場合はこちらを参考にして下さい。


基礎からのOracle (DVD付) (プログラマの種シリーズ)基礎からのOracle (DVD付) (プログラマの種シリーズ)
西沢 夢路

ソフトバンククリエイティブ 2010-05-28
売り上げランキング : 143286

Amazonで詳しく見る