Oracleでジョブスケジューラーの使い方
 
自動実行。それはコンピューターの使命みたいな所があり、
 Windowsならタスクスケジューラー、Linuxならcrontab
 そして、Oracleならジョブスケジューラーとなるわけだが、
 自分的にOracleとはあまりかかわらないように生きてきたし、

  これからもその様に生きていきたい。
 とか、思ったりするが、仕事でOracle技術者がおらん、人が足らん。
 
そんなこんなで今日も土曜なのにOracleと戦います。
 
さて、
ジョブスケジューラーだけど、追加すると実行できるわけだが、
 単に追加しただけではダメっぽいです。
 追加して、有効化する必要がある。
 今日はジョブの  追加、有効化、無効化、削除のやりかたをここにメモして行きます。
 
 ちなみに、以下の例はsqlplusで実行することが可能です。
 あ、それと、スケジュールとジョブを別々に追加する方法もあるっぽいですが、
 そんなめんどっちー事しないで、ここでは、ジョブの追加&スケジュールの

   追加を一緒にやっております。

 

■ジョブの追加
 
 ジョブの名前はTESTとしてやっていきます。
 実行するコマンドは job_actionで指定。
  job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' の部分。
 ジョブは定期的に実行されるのでその実行間隔や時間を指定できます。
  repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0' )
   この場合は毎日11時53分0秒に実行される。
   他にも毎週、毎月、毎年などあり。
    FREQ=DAILY;
    FREQ=WEEKLY;BYDAY=MON
    FREQ=MONTHLY;BYMONTHDAY=15;
    FREQ=YEARLY;
  さらに、スケジュールする範囲の開始日と終了日を指定できたりするみたいだ。
 
 SQL> BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0' );COMMIT;END;
   /
 上のスラッシュ入れないと実行されない。
 これって、なんなん?
 
 で、追加されたものを確認。
 SQL> select job_name,state from all_scheduler_jobs;
 JOB_NAME
 --------------------------------------------------------------------------------
 STATE
 ----------------------------------------
 TEST
 DISABLED
 ↑無効化の状態で追加されている。
 ちなみに、この後の有効化も一行で行う場合は, enabled=>TRUE の部分を

   追加するとよろしい。
 ※
  SQL> BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0', enabled=>TRUE );COMMIT;END;

 

■ジョブの有効化
 
 SQL> BEGIN DBMS_SCHEDULER.ENABLE('TEST'); END;
   /
 確認コマンド
 SQL> select job_name,state from all_scheduler_jobs;
 JOB_NAME
 --------------------------------------------------------------------------------
 STATE
 ----------------------------------------
 TEST
 SCHEDULED
 ↑有効化された。
 この状態で定期的にコマンドが動きます。

 

■ジョブの無効化
 
 無効化/有効化はジョブを削除しないで、
  無効化することで、定期メンテの時とか
   ジョブの動作を一時的に停止することが可能で、
    メンテが終わってから有効化するなどの使用方法が可能ですね。


 SQL> BEGIN DBMS_SCHEDULER.DISABLE('TEST'); END;
   /
 確認コマンド
 SQL> select job_name,state from all_scheduler_jobs;
 JOB_NAME
 --------------------------------------------------------------------------------
 STATE
 ----------------------------------------
 TEST
 DISABLED
 ↑無効化された。
 
■ジョブの削除
 
 SQL> BEGIN DBMS_SCHEDULER.DROP_JOB('TEST'); END;
   /
 確認コマンド
 SQL> select job_name,state from all_scheduler_jobs;
 レコードが選択されませんでした。
 ↑無くなっとる。
 
■sqlコマンドを連続で流す方法
 
 知らなかった。こんな簡単だなんて。
 テキストファイルにコマンドを連続でずらずらーっと書いておいて。
 例...
 sql.sqlファイル
  BEGIN DBMS_SCHEDULER.DROP_JOB('TEST'); END;
  /
  BEGIN dbms_scheduler.create_job('"TEST"', job_type=>'PLSQL_BLOCK', job_action=> 'DELETE FROM t2 WHERE K1=''hokkaido'';' ,start_date=>systimestamp, repeat_interval=>'FREQ=DAILY;BYHOUR=11;BYMINUTE=53;BYSECOND=0', enabled=>TRUE );COMMIT;END;
  /
  select job_name,state from all_scheduler_jobs;
 
 で、sqlplusのプロンプトで@sql.sqlとする。
 
 SQL> @C:¥sql.sql
 PL/SQLプロシージャが正常に完了しました。
 PL/SQLプロシージャが正常に完了しました。
 JOB_NAME
 --------------------------------------------------------------------------------
 STATE
 ----------------------------------------
 TEST
 SCHEDULED
 SQL>
 
 これは便利。
 
■コマンドラインからファイル実行
 
 その他にもsqlplusを起動するときにsqlファイルを指定する方法もある。
 
 C:¥>sqlplus miha/MXXXXX1@orclpdb @sql.sql
 SQL*Plus: Release 19.0.0.0.0 - Production on 土 3月 11 12:40:00 2023
 Version 19.3.0.0.0
 Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 最終正常ログイン時間: 土 3月  11 2023 12:37:21 +09:00
 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Version 19.3.0.0.0
 に接続されました。
 PL/SQLプロシージャが正常に完了しました。
 PL/SQLプロシージャが正常に完了しました。
 JOB_NAME
 --------------------------------------------------------------------------------
 STATE
 ----------------------------------------
 TEST
 SCHEDULED
 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Version 19.3.0.0.0との接続が切断されました。
 C:¥>
 ↑sqlファイルの最後にquitを書いておくと自動的にsqlplusが終了されてコマンドプロンプトに戻る