Oracle PL/SQLブロックでバッチからオブジェクトをコンパイルする
おはようございます。
またまた Oracle の話しになります。
今回は昔作ったちょっとしたツールを公開。
Oracleの機能で、Viewやらプロシージャ、PL/SQLというのがあって、
ひとつずつコンパイルするのは特に問題ないのですが、
一括でコンパイルしたい場合にはオブジェクトブラウザーなどのツールがないとちょっと面倒。
ということでバッチでコンパイルできるようにしました。
スポンサーリンク
オブジェクトをコンパイルする
プロシージャをコンパイルせずに利用できる
PL/SQLブロックというプログラムを実行するバッチとなります。
実行するSQL
次のプログラムをファイルに保存してください。
COMPILE.SQL
SPOOL &1
SET SERVEROUTPUT ON SIZE 1000000
SET LINESIZE 10000
SET ECHO ON
SET PAGESIZE 500
WHENEVER SQLERROR EXIT 10 ROLLBACK
WHENEVER OSERROR EXIT 20 ROLLBACK
BEGIN
FOR CUR_REC IN (
SELECT
OWNER
, OBJECT_NAME
, OBJECT_TYPE
FROM
DBA_OBJECTS
WHERE
OBJECT_TYPE IN ('VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY')
AND OWNER = '&2'
AND STATUS = 'INVALID' -- 無効なものだけコンパイルする場合に指定する
ORDER BY
-- コンパイルする順番を指定
--(パッケージ→パッケージボディの順番じゃないとエラーとなる場合がある)
DECODE(OBJECT_TYPE, 'VIEW', 1, 'PROCEDURE', 2, 'FUNCTION', 3, 'PACKAGE', 4, 'PACKAGE BODY', 5)
)
LOOP
BEGIN
-- パッケージボディのみ構文を分ける
IF CUR_REC.OBJECT_TYPE IN ('VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE') THEN
EXECUTE IMMEDIATE 'ALTER ' || CUR_REC.OBJECT_TYPE || ' "' || CUR_REC.OWNER || '"."' || CUR_REC.OBJECT_NAME || '" COMPILE';
ELSE
EXECUTE IMMEDIATE 'ALTER PACKAGE "' || CUR_REC.OWNER || '"."' || CUR_REC.OBJECT_NAME || '" COMPILE BODY';
END IF;
-- 成功ログ
DBMS_OUTPUT.PUT_LINE(' ' || CUR_REC.OBJECT_TYPE || ' : ' || CUR_REC.OWNER || ' : ' || CUR_REC.OBJECT_NAME || ' : OK');
EXCEPTION
WHEN OTHERS THEN
-- 失敗ログ
DBMS_OUTPUT.PUT_LINE(' ' || CUR_REC.OBJECT_TYPE || ' : ' || CUR_REC.OWNER || ' : ' || CUR_REC.OBJECT_NAME || ' : NG');
END;
END LOOP;
END;
/
SPOOL OFF
EXIT 0
SQL呼び出しバッチ
COMPILE.SQLを呼び出すバッチです。
環境にあわせて変数の設定をして保存してください。
COMPILE.bat
@echo off REM 実行するSQLファイル SET SQLFILE=COMPILE.SQL REM ログファイル(スプール) SET LOGFILE=COMPILE.LOG REM 対象ユーザー SET TARGET= REM パスワード SET PASS= REM TNSサービス名 SET SERVICE_NAME= REM 実行 sqlplus %TARGET%/%PASS%@%SERVICE_NAME% @%SQLFILE% "%LOGFILE%" "%TARGET%" pause
まとめ
ちょっと実行結果を公開する環境がないので、
スクリーンショットはありませんが、Oracle11gで動作確認済みです。
OracleのPL/SQLブロックはこういったツールに最適なので、
色々やってみると面白いと思いますよ。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません