Oracle定期タスクの実装方法

1.ログ用テーブル作成

CREATE TABLE SAMPLE_LOG(RECORD_TIME DATE); 

2.PL/SQLプロシージャ定義

CREATE OR REPLACE PROCEDURE LOG_INSERT_PROC AS
BEGIN
    INSERT INTO SAMPLE_LOG VALUES (SYSDATE);
END;

3.DBMS_JOBによる定期実行設定

DECLARE
    JOB_ID NUMBER;
BEGIN
    dbms_job.submit(
            JOB_ID, -- ジョブ識別子
            'LOG_INSERT_PROC;', -- 実行対象プロシージャ
            SYSDATE, -- 初回実行日時
            'TRUNC(sysdate,''mi'') + 1/ (24*60)' -- 実行間隔(1分)
        );
    COMMIT;
END;

パラメータ構成:

  • job:ジョブ管理番号
  • what:実行対象のSQL/PLコード
  • next_date:初回実行時刻
  • interval:実行間隔式

4.ジョブ状態確認

SELECT * FROM SAMPLE_LOG

管理コマンド:

-- 全ジョブ情報取得
select * from user_jobs;
-- 実行中ジョブ確認
select * from dba_jobs_running;
-- 完了済みジョブ確認
select * from dba_jobs;

ジョブ操作例:

BEGIN
    DBMS_JOB.RUN(25); -- ID=25の強制実行
    COMMIT;
END;

ジョブ停止:

BEGIN
    DBMS_JOB.BROKEN(25,  TRUE,  SYSDATE);
    COMMIT;
END;

ジョブ削除:

BEGIN
    DBMS_JOB.REMOVE(25);
    commit;
END;

インターバル設定パターン

| 実行タイミング           | INTERVAL式                                                                 |
|--------------------------|---------------------------------------------------------------------------|
| 午前0時                  | TRUNC(SYSDATE + 1)                                                       |
| 午前8時30分              | TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)                                  |
| 火曜日正午              | NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24                           |
| 月初0時                 | TRUNC(LAST_DAY(SYSDATE ) + 1)                                            |
| 季節末日23時            | TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24                         |
| 土日06:10               | TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY")))+(6×60+10)/(24×60)|

高速実行設定:

  • 秒単位: sysdate + 1/(24 * 60 * 60)
  • 10秒間隔: sysdate + 10/(24 * 60 * 60)
  • 分単位: TRUNC(sysdate,'mi') + 1/ (24*60)
  • 10分間隔: TRUNC(sysdate,'mi') + 10/ (24*60)

日次スケジュール:

Interval => TRUNC(sysdate) + 1 +1/ (24) -- 01:00

週次スケジュール:

Interval => TRUNC(next_day(sysdate,'Monday'))+1/24

月次スケジュール:

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

四半期スケジュール:

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

半年スケジュール:

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

年次スケジュール:

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

タグ: Oracle 定期タスク dbms_job PL/SQL

6月24日 18:12 投稿