このような機能は Oracle 9i でも DBMS_JOBパッケージとして提供されていましたが、ストアド・プロシージャしか実行できませんでした。
それが、DBMS_SCHEDULERパッケージになって大幅に機能が拡張され、ストアド・プロシージャのほか、PL/SQLブロック、外部プログラムを実行できるようになったのですが、中でも外部プログラムが実行できるようになったことはありがたいですね。
DBMS_SCHEDULERパッケージを利用した外部プログラムのスケジュール設定例は以下のような感じです。
BEGIN DBMS_SCHEDULER.CREATE_PROGRAM( program_name => 'SYS.RMAN_BACKUP_PROGRAM', program_type => 'executable', program_action => 'C:\oracle\product\10.1.0\db_1\BIN\RMAN.EXE target / cmdfile "C:\oracle\backup\rman_backup.cmd" log "C:\oracle\backup\rman_backup.log"', number_of_arguments => 0, enabled => true, comments => 'RMAN Backup Program' ); DBMS_SCHEDULER.CREATE_SCHEDULE( schedule_name => 'SYS.RMAN_BACKUP_SCHEDULE', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=1; BYMINUTE=0; BYSECOND=0', comments => 'RMAN Backup Schedule' ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'SYS.RMAN_BACKUP_JOB', program_name => 'SYS.RMAN_BACKUP_PROGRAM', schedule_name => 'SYS.RMAN_BACKUP_SCHEDULE', enabled => true, auto_drop => false, comments => 'RMAN Backup Job' ); END; /この例では、月曜から金曜までの毎日午前1時に rman_backup.cmd という Recovery Manager のスクリプトファイルを実行してバックアップを行っています。
(コマンドの引数は外に切り出して定義し、引数の値だけを変更して実行することもできますが、引数が固定の場合は面倒なので上記のようにベタに書いたほうが楽です^^;)
また、この例ではプログラム、スケジュールを作成し、それを組み合わせてジョブを作成していますが、以下のようにジョブに直接コマンドを書くことも可能です。
BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE( schedule_name => 'SYS.RMAN_BACKUP_SCHEDULE', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=1; BYMINUTE=0; BYSECOND=0', comments => 'RMAN Backup Schedule' ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'SYS.RMAN_BACKUP_JOB', job_type => 'executable', job_action => 'C:\oracle\product\10.1.0\db_1\BIN\RMAN.EXE target / cmdfile "C:\oracle\backup\rman_backup.cmd" log "C:\oracle\backup\rman_backup.log"', schedule_name => 'SYS.RMAN_BACKUP_SCHEDULE', enabled => true, auto_drop => false, comments => 'RMAN Backup Job' ); END; /
このように Recovery Manager、SQL*Loader、インポート/エクスポート、Data Pumpインポート/エクスポートなどの Oracle の外部ユーティリティはもちろん、独自に開発したプログラムなども Oracle 上でスケジュール実行できるようになるため、活用シーンがグンと広がります。
(私は Oracle 9i で外部プログラムをスケジュール実行したい時には、外部プログラムを実行する Javaストアドプロシージャを作成し、それを実行するようにしていましたが、Oracle 10g ではそんなことをしなくてもいいのです...^^;)