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

PolarDB:DBMS_JOB

最終更新日:Jan 06, 2025

PolarDBは、スケジュールされたジョブのスケジュールと管理に使用されるDBMS_JOB拡張機能を提供します。 このトピックでは、スケジュールされたジョブを作成、管理、および削除する方法について説明します。

前提条件

  • PolarDBクラスターのカーネルバージョンは1.1.7以降です。リリースノート

    説明

    次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを照会できます。

    SHOW polar_version;
  • セキュリティ上の理由から、DBMS_JOB拡張機能を手動で作成することはできません。 DBMS_JOB拡張機能を作成するには、お問い合わせください

使用上の注意

  • 特権アカウントのみがDBMS_JOB拡張機能を使用できます。 特権アカウントの作成方法の詳細については、「データベースアカウントの作成」をご参照ください。

  • dbms_job拡張子は、postgresデータベースにのみ作成できます。 他のデータベースのスケジュール済みジョブを構成する場合は、postgresデータベースでクロスデータベースのスケジュール済みジョブを構成します。 詳細については、「データベース間でのスケジュールされたジョブの実行」をご参照ください。

テストデータの準備

説明

テストデータは、このトピックで提供されている例にのみ適用されます。

次の例に示すように、テスト用に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;

DBMS_JOB拡張子の削除

警告

DBMS_JOB拡張子を削除すると、DBMS_JOB拡張子に関連する既存のユーザージョブがすべて削除されます。

次の構文を使用して、DBMS_JOB拡張を削除できます。

DROP EXTENSION dbms_job CASCADE;

スケジュールされたジョブの作成

構文

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

表 1. Parameters

パラメーター

説明

仕事

渡すjobid値。 jobid値を渡すと、送信されたジョブのIDが返されます。 ジョブIDは自動的に生成され、ジョブごとに一意です。

呼び出すストアドプロシージャの名前。 このパラメーターを指定する必要があります。 このトピックの例では、job_procストアドプロシージャを使用しています。

next_date

スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。

interval

スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。

表 2. インターバルの説明

実行間隔

毎分

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

毎日

システムは毎日01:00:00にジョブを実行します。

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

毎週

システムは毎週月曜日の01:00:00にジョブを実行します。

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

毎月

システムは毎月1日の01:00:00にジョブを実行します。

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

四半期ごと

システムは、四半期ごとの初日の01:00:00にジョブを実行します。

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

毎年

システムは毎年1月1日の01:00:00にジョブを実行します。

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

定点インタイム

システムは毎朝08:10:00にジョブを実行します。

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

固定間隔

システムは、08:15:00、09:15:00、10:15:00など、1時間の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)$$);

スケジュールされたジョブの照会

次のステートメントを実行して、現在のユーザーが作成したスケジュール済みジョブを照会できます。

SELECT * FROM sys.user_jobs;

スケジュールされたジョブの内容、開始時刻、実行間隔の変更

構文

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

表 3. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

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

説明

現在の値を使用する場合は、このパラメーターをNULLに設定します。

next_date

スケジュールされたジョブの開始時刻。

説明

現在の値を使用する場合は、このパラメーターをNULLに設定します。

interval

スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。

説明

現在の値を使用する場合は、このパラメーターをNULLに設定します。

ストアドプロシージャを変更せずに、ジョブIDが1のスケジュール済みジョブを変更するとします。 また、スケジュールされたジョブの開始時間を2020年12月29日に変更し、1時間の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. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

interval

スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。

ジョブIDが1のスケジュールジョブを変更するとします。 毎日01:00:00にジョブを実行する間隔を設定します。 次のサンプル文は例を示します。

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

スケジュールされたジョブの開始時刻の変更

構文

NEXT_DATE(job BINARY_INTEGER, next_date DATE)

表 5. Parameters

パラメーター

説明

仕事

ジョブ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. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

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

ジョブIDが1のスケジュールジョブを変更するとします。 ストアドプロシージャをjob_proc2に変更します。 次のサンプル文は例を示します。

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

スケジュールされたジョブの停止と開始

構文

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

表7. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

壊れた

スケジュールされたジョブの状態。 有効な値:

  • true: スケジュールされたジョブの状態が異常です。 スケジュールジョブの状態が異常である場合、スケジュールジョブは停止される。 dbms_job.runコマンドを実行すると、状態が異常なスケジュールジョブを強制的に実行できます。

  • false: スケジュールされたジョブの状態が正常です。

next_date

スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。

ジョブIDが1のスケジュールジョブの状態を異常として指定します。 次のサンプル文は例を示します。

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

ジョブIDが1のスケジュールジョブの状態を通常通り指定します。 次のサンプル文は例を示します。

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

スケジュールされたジョブを強制的に実行する

構文

RUN(job BINARY_INTEGER)

表8. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

ジョブIDが1のスケジュールジョブを強制的に実行します。 次のサンプル文は例を示します。

BEGIN
    DBMS_JOB.RUN(1);
END;
説明

クライアントツールを使用してデータベースに接続し、前述のステートメントを実行した後に、次のようなエラーメッセージが返された場合、クライアントツールはサポートされていません。 代わりにPolarDB-Toolsを使用します。 詳細については、「PolarDB-Tools」をご参照ください。

ERROR: syntax error at end of input
CONTEXT: polar-spl function dbms_job._run_job(integer,boolean) line 151 at RAISE line 547 of package body

スケジュール済みタスクの削除

構文

REMOVE(job BINARY_INTEGER)

表9. Parameters

パラメーター

説明

仕事

ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。

ジョブIDが1の予定ジョブを削除します。 次のサンプル文は例を示します。

BEGIN
    DBMS_JOB.REMOVE(1);
END;

スケジュールされたジョブの実行レコードの照会

次のステートメントを実行して、スケジュールされたジョブの実行レコードを照会できます。

SELECT * FROM dbmsjob.pga_joblog;

データベース間でスケジュールされたジョブを実行する

DBMS_JOB拡張は、postgresデータベースにのみ適用されます。 他のデータベースのスケジュール済みジョブを構成する場合は、postgresデータベースでクロスデータベースのスケジュール済みジョブを構成します。

例を使用して、データベース間でスケジュールされたジョブを構成する方法を説明します。 この例では、DBMS_JOB拡張はpostgresデータベースで設定されています。 スケジュールされたジョブは、testという名前のデータベースで実行されるように構成されます。 この例では、testデータベースのテーブルに1分あたり1つのデータレコードを挿入します。 データベースの作成方法の詳細については、「データベースの作成」をご参照ください。

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

    • 次のステートメントを実行して、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)','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 dbmsjob.pga_joblog;

      次の出力が返されます。

       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データベースのjobrunテーブルのデータを照会します。

    実行するステートメントは、次のとおりです。

    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
説明

データベース間でスケジュールされたジョブに関する情報を変更する場合は、関数を変更するときに、スケジュールされたジョブを実行するpostgresデータベースの名前を追加する必要があります。 たとえば、実行間隔を前の例の1分ごとから2分ごとに変更する場合は、次のステートメントを実行します。

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