Oracle PL/SQLブロックでバッチからオブジェクトをコンパイルする
おはようございます。
またまた Oracle の話しになります。
今回は昔作ったちょっとしたツールを公開。
Oracleの機能で、Viewやらプロシージャ、PL/SQLというのがあって、
ひとつずつコンパイルするのは特に問題ないのですが、
一括でコンパイルしたい場合にはオブジェクトブラウザーなどのツールがないとちょっと面倒。
ということでバッチでコンパイルできるようにしました。
スポンサーリンク
オブジェクトをコンパイルする
プロシージャをコンパイルせずに利用できる
PL/SQLブロックというプログラムを実行するバッチとなります。
実行するSQL
次のプログラムをファイルに保存してください。
COMPILE.SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | SPOOL&1 SETSERVEROUTPUTONSIZE1000000 SETLINESIZE10000 SETECHOON SETPAGESIZE500 WHENEVERSQLERROREXIT10ROLLBACK WHENEVEROSERROREXIT20ROLLBACK BEGIN FORCUR_RECIN( SELECT OWNER ,OBJECT_NAME ,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_TYPEIN('VIEW','PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY') ANDOWNER='&2' ANDSTATUS='INVALID'-- 無効なものだけコンパイルする場合に指定する ORDERBY -- コンパイルする順番を指定 --(パッケージ→パッケージボディの順番じゃないとエラーとなる場合がある) DECODE(OBJECT_TYPE,'VIEW',1,'PROCEDURE',2,'FUNCTION',3,'PACKAGE',4,'PACKAGE BODY',5) ) LOOP BEGIN -- パッケージボディのみ構文を分ける IFCUR_REC.OBJECT_TYPEIN('VIEW','PROCEDURE','FUNCTION','PACKAGE')THEN EXECUTEIMMEDIATE'ALTER '||CUR_REC.OBJECT_TYPE||' "'||CUR_REC.OWNER||'"."'||CUR_REC.OBJECT_NAME||'" COMPILE'; ELSE EXECUTEIMMEDIATE'ALTER PACKAGE "'||CUR_REC.OWNER||'"."'||CUR_REC.OBJECT_NAME||'" COMPILE BODY'; ENDIF; -- 成功ログ DBMS_OUTPUT.PUT_LINE(' '||CUR_REC.OBJECT_TYPE||' : '||CUR_REC.OWNER||' : '||CUR_REC.OBJECT_NAME||' : OK'); EXCEPTION WHENOTHERSTHEN -- 失敗ログ DBMS_OUTPUT.PUT_LINE(' '||CUR_REC.OBJECT_TYPE||' : '||CUR_REC.OWNER||' : '||CUR_REC.OBJECT_NAME||' : NG'); END; ENDLOOP; END; / SPOOLOFF EXIT0 |
SQL呼び出しバッチ
COMPILE.SQLを呼び出すバッチです。
環境にあわせて変数の設定をして保存してください。
COMPILE.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @echo off REM 実行するSQLファイル SETSQLFILE=COMPILE.SQL REM ログファイル(スプール) SETLOGFILE=COMPILE.LOG REM 対象ユーザー SETTARGET= REM パスワード SETPASS= REM TNSサービス名 SETSERVICE_NAME= REM 実行 sqlplus%TARGET%/%PASS%@%SERVICE_NAME%@%SQLFILE%"%LOGFILE%""%TARGET%" pause |
まとめ
ちょっと実行結果を公開する環境がないので、
スクリーンショットはありませんが、Oracle11gで動作確認済みです。
OracleのPL/SQLブロックはこういったツールに最適なので、
色々やってみると面白いと思いますよ。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません