すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_JOB

最終更新日:Jan 07, 2026

PolarDB は、タスクのスケジュールと管理を行うための DBMS_JOB パッケージを提供します。このトピックでは、定期タスクの作成、管理、削除方法について説明します。セキュリティイベントのため、このプラグインはデータベースカーネルバージョン 2.0.14.19.39.1 以降ではデフォルトで無効になっていることにご注意ください。定期タスクを管理するための、より安全で効率的な代替手段として pg_cron を使用することを推奨します。

テストデータの準備

説明

このセクションのテストデータは、このトピックの例にのみ適用されます。

テスト用に jobrun という名前のテーブルを作成します。以下に例を示します。

CREATE TABLE jobrun (
    id              serial               NOT NULL PRIMARY KEY,
    runtime         VARCHAR2(40)
);

job_proc という名前のストアドプロシージャを作成します。以下に例を示します。

CREATE PROCEDURE job_proc
IS
BEGIN
    INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
END;

定期タスクの作成

構文

SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])

表 1. パラメーターの説明

パラメーター

説明

job

送信されたタスクの ID を返すために jobid を渡します。この ID は自動的に生成され、各タスクで一意です。

what

呼び出すストアドプロシージャの名前。このパラメーターは空にできません。このトピックでは、job_proc ストアドプロシージャを例として使用します。

next_date

定期タスクの開始時刻。このパラメーターを指定しない場合、デフォルトで現在の時刻が使用されます。

interval

定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。

表 2. INTERVAL リファレンス

実行間隔

毎分実行

TRUNC(sysdate,'mi') + 1/(24*60)

毎日特定の時刻に実行

毎日 01:00 に実行:

TRUNC(sysdate) + 1 + 1/(24)

毎週特定の時刻に実行

毎週月曜日の 01:00 に実行:

TRUNC(next_day(sysdate,'monday')) + 1/24

毎月特定の時刻に実行

毎月 1 日の 01:00 に実行:

TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24

四半期ごとに特定の時刻に実行

四半期ごとの 1 日目の 01:00 に実行:

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

毎年特定の時刻に実行

毎年 1 月 1 日の 01:00 に実行:

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

固定時刻に実行

毎朝 08:10 に実行:

Trunc(Sysdate+1) + (8*60+10)/24*60

固定間隔で実行

毎時 15 分に実行 (例:08:15、09:15、10:15)。

Trunc(sysdate,'hh') + (60+15)/(24*60)

job_proc ストアドプロシージャを呼び出して、定期タスクを作成します。以下に例を示します。

DECLARE
   jobid           INTEGER;
BEGIN
   DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)');
END;
説明

定期タスクの時刻に単一引用符を使用すると、ネストされた引用符が構文エラーを引き起こします。次の文は、誤った構文の例です。

DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'TRUNC(sysdate,'mi') + 1/(24*60)');

このエラーを回避するには、パラメーターを $$ 形式に変更する必要があります。次の文は、正しい構文の例です。

DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, $$TRUNC(sysdate,'mi') + 1/(24*60)$$);

定期タスクの内容、実行時刻、実行間隔の変更

構文

CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)

表 3. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

what

呼び出すストアドプロシージャの名前。

説明

現在の値を変更しない場合は、このパラメーターを NULL に設定します。

next_date

定期タスクの開始時刻。

説明

現在の値を変更しない場合は、このパラメーターを NULL に設定します。

interval

定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。

説明

現在の値を変更しない場合は、このパラメーターを NULL に設定します。

タスク ID 1 の定期タスクを変更します。呼び出されるストアドプロシージャは変更しません。開始時刻を 2020年12月29日 に変更し、実行間隔を毎時 15 分に設定します。以下に例を示します。

BEGIN
    DBMS_JOB.CHANGE(1,NULL,TO_DATE('29-DEC-20','DD-MON-YY'),$$Trunc(sysdate,'hh') + (60+15)/(24*60)$$);
END;

定期タスクの実行間隔の変更

構文

INTERVAL(job BINARY_INTEGER, interval VARCHAR2)

表 4. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

interval

定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。

タスク ID 1 の定期タスクを変更します。実行間隔を毎日 01:00 に変更します。以下に例を示します。

BEGIN
    DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;

定期タスクの実行時刻の変更

構文

NEXT_DATE(job BINARY_INTEGER, next_date DATE)

表 5. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

next_date

定期タスクの開始時刻。

タスク ID 1 の定期タスクを変更し、開始時刻を 2020年12月30日 に設定します。以下に例を示します。

BEGIN
    DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20','DD-MON-YY'));
END;

定期タスクの内容の変更

構文

WHAT(job BINARY_INTEGER, what VARCHAR2)

表 6. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

what

呼び出されるストアドプロシージャの名前。

タスク ID 1 の定期タスクを変更します。呼び出されるストアドプロシージャを job_proc2 に変更します。以下に例を示します。

BEGIN
    DBMS_JOB.WHAT(1,'job_proc2');
END;

定期タスクの停止と開始

構文

BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])

表 7. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

broken

定期タスクの状態。有効値:

  • true: タスクの状態を broken に設定します。broken 状態のタスクは実行を停止します。dbms_job.run を使用して、broken 状態のタスクを強制的に実行できます。

  • false: タスクの状態を normal に設定します。

next_date

定期タスクの開始時刻。このパラメーターを指定しない場合、デフォルトで現在の時刻が使用されます。

タスク ID 1 の定期タスクの状態を broken に設定します。以下に例を示します。

BEGIN
    DBMS_JOB.BROKEN(1,true);
END;

タスク ID 1 の定期タスクの状態を normal に設定します。以下に例を示します。

BEGIN
    DBMS_JOB.BROKEN(1,false);
END;

定期タスクの強制開始

構文

RUN(job BINARY_INTEGER)

表 8. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

タスク ID 1 の定期タスクを強制的に開始します。以下に例を示します。

BEGIN
    DBMS_JOB.RUN(1);
END;

定期タスクの削除

構文

REMOVE(job BINARY_INTEGER)

表 9. パラメーターの説明

パラメーター

説明

job

タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。

タスク ID 1 の定期タスクを削除します。以下に例を示します。

BEGIN
    DBMS_JOB.REMOVE(1);
END;

定期タスクの表示

次の文を実行して、現在のユーザーが作成した定期タスクのリストを表示します。

SELECT * FROM sys.user_jobs;

タスク実行レコードの表示

次の文を実行して、定期タスクの実行レコードを表示します。

SELECT * FROM all_scheduler_job_run_details;

データベース間の定期タスクの実行

DBMS_JOB エクステンションは postgres データベースでのみ設定できます。他のデータベースに定期タスクを設定するには、データベース間のタスクを設定する必要があります。

次の例では、DBMS_JOB エクステンションは postgres データベースで設定され、test データベースで実行されます。このタスクは、test データベースのテーブルに 1 分ごとに 1 つのデータレコードを挿入します。データベースの作成方法の詳細については、「データベース管理」をご参照ください。

  1. test データベースで、jobrun という名前のテーブルと job_proc という名前のストアドプロシージャを作成します。

    • jobrun という名前のテーブルを作成します。以下にコマンドの例を示します。

      CREATE TABLE public.jobrun (
          id              serial               NOT NULL PRIMARY KEY,
          runtime         VARCHAR2(40)
      );
    • job_proc という名前のストアドプロシージャを作成します。以下にコマンドの例を示します。

      CREATE PROCEDURE public.job_proc
      IS
      BEGIN
          INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
      END;
  2. postgres データベースに切り替えて、定期タスクを作成します。

    DBMS_JOB.SUBMIT() 関数にターゲットデータベースを追加する必要があります。この例では、ターゲットデータベースは test です。他のパラメーターの詳細については、「定期タスクの作成」をご参照ください。

    例:

    DECLARE
       jobid           INTEGER;
    BEGIN
      DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)', false, 'test');
    END;
  3. postgres データベースで、定期タスクの状態と実行レコードを表示できます。

    • 定期タスクの表示:

      SELECT * FROM sys.user_jobs;

      コマンドは次の結果を返します。

       job | jobloguser | job_user | database |           job_created            |           job_changed            |            last_date             | last_sec |         next_date         | next_sec |   total_time    | broken |                 interval                 | failures |                                                      what                                                       | instance
      -----+------------+----------+----------+----------------------------------+----------------------------------+----------------------------------+----------+---------------------------+----------+-----------------+--------+------------------------------------------+----------+-----------------------------------------------------------------------------------------------------------------+----------
         1 | DBUSER     | dbuser   | postgres | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:51:12.025001 +00:00 | 02:51:12 | 29-OCT-20 02:53:12 +00:00 | 02:53:12 | 00:00:00.243224 | N      | BEGIN return SYSDATE + 1/(24 * 30); END; |        0 |  BEGIN EXECUTE IMMEDIATE 'SELECT dbmsjob.dbms_job_internal_job_link(''BEGIN job_proc; END;'', ''test'');' ; END |        0
    • 実行レコードの表示:

      SELECT * FROM all_scheduler_job_run_details;

      コマンドは次の結果を返します。

       jlgid | jlgjobid | jlgstatus |             jlgstart             |   jlgduration   
      -------+----------+-----------+----------------------------------+-----------------
           1 |        1 | s         | 29-OCT-20 02:38:49.762995 +00:00 | 00:00:00.017495
           2 |        1 | s         | 29-OCT-20 02:39:50.061113 +00:00 | 00:00:00.016463
           3 |        1 | s         | 29-OCT-20 02:40:50.062331 +00:00 | 00:00:00.016244
  4. test データベースに切り替えて、テーブル内のデータをクエリします。

    以下はクエリコマンドです。

    SELECT * FROM jobrun;

    コマンドは次の結果を返します。

     id |               runtime               
    ----+-------------------------------------
      1 | job_proc run at 2020-10-29 02:38:50
      2 | job_proc run at 2020-10-29 02:39:50
      3 | job_proc run at 2020-10-29 02:40:50
説明

データベース間のタスクを変更するには、関数を変更するときに対応するデータベース名を指定する必要があります。たとえば、実行間隔を毎分から 2 分ごとに変更するには、次のコードを使用します。

BEGIN
    DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;