Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


DBMS_SCHEDULER系统包

📄字数 6.7K
👁️阅读量 加载中...

一、概述

DBMS_SCHEDULER系统包是一个定时作业调度工具包,用于在数据库中创建、管理定时作业,支持更灵活、精细的调度规则和作业参数。

在该系统包中提供了以下接口:

包体函数名简要描述
CREATE_JOB创建一个定时作业
ENABLE启用定时作业
DISABLE禁用定时作业
DROP_JOB删除定时作业
JOB_NEXT_RUNTIME根据作业的最近一次执行时间,计算作业的下次执行时间
NEXT_RUNTIME根据指定的调度时间串计算下次执行时间
RUN_JOB用于手动执行一次作业
SET_ATTRIBUTE用于修改作业属性
SET_JOB_ARGUMENT_VALUE用于设置作业参数

典型应用场景,如:

  • 每天凌晨执行存储过程,自动清理日志或刷新数据
  • 手动执行任务进行调试,验证逻辑是否正确
  • 查询作业运行计划,下次运行时间是否如预期
  • 修改作业参数,动态调整调度策略

二、CREATE_JOB

2.1 功能描述

该接口用于创建定时作业

2.2 方法声明

sql

PROCEDURE CREATE_JOB (
    JOB_NAME             IN VARCHAR2,
    JOB_TYPE             IN VARCHAR2,
    JOB_ACTION           IN VARCHAR2,
    NUMBER_OF_ARGUMENTS  IN PLS_INTEGER     DEFAULT 0,
    START_DATE           IN TIMESTAMP       DEFAULT NULL,
    REPEAT_INTERVAL      IN VARCHAR2        DEFAULT NULL,
    END_DATE             IN TIMESTAMP       DEFAULT NULL,
    JOB_CLASS            IN VARCHAR2        DEFAULT 'DEFAULT_JOB_CLASS',
    ENABLED              IN BOOLEAN         DEFAULT FALSE,
    AUTO_DROP            IN BOOLEAN         DEFAULT TRUE,
    COMMENTS             IN VARCHAR2        DEFAULT NULL
       );

2.3 参数说明

参数名类型取值范围是否可选描述
JOB_NAMEVARCHAR2任务名
JOB_TYPEVARCHAR2PLSQL_BLOCK/STORED_PROCEDURE执行体类型,当前支持块语句(PLSQL_BLOCK)和存储过程(STORED_PROCEDURE)
JOB_ACTIONVARCHAR2任务执行体
NUMBER_OF_ARGUMENTSPLS_INTEGER[0,100]是,默认为0执行体参数个数
START_DATETIMESTAMP是,默认为NULL任务开始时间,开始时间应小于结束时间
REPEAT_INTERVALVARCHAR2是,默认为NULL调度时间串设置,格式为:'FREQ=XXX; INTERVAL=XXX;...',用于设置频率、间隔等
END_DATETIMESTAMP是,默认为NULL任务结束时间,结束时间应大于当前系统时间,为NULL表示永远不会结束
JOB_CLASSVARCHAR2是,默认为DEFAULT_JOB_CLASS作业类型,暂无意义,预留
ENABLEDBOOLEANTRUE/FALSE是,默认为FALSE是否禁止
AUTO_DROPBOOLEANTRUE/FALSE是,默认为TRUE作业执行完是否自动删除
COMMENTSVARCHAR2是,默认为NULL注释文本
  • REPEAT_INTERVAL调度时间串语法结构如下:
sql
Freq=<time_period>; Interval=<integer>; 
[PERIDDS = 
| BYHOUR=<hour_list> 
| BYDAY=<day_list> 
| BYMONTHDAY=<day_list> 
| BYMONTH=<month_list> 
| BYWEEKNO=<week_list> 
| BYYEARDAY=<day_list> 
| BYDATE=<date_list> 
| BYMINUTE=<minute_list> 
| BYSECOND=<second_list>]
  • Freq关键字用于指定作业间隔的时间周期,<time_period>可选参数包括:YEARLY(年)、MONTHLY(月)、WEEKLY(周)、DAILY(日)、HOURLY(小时)、MINUTELY(分)、SECONDLY(秒)。
  • Interval关键字用于指定作业间隔频度,该值为一个整数,默认为1,可指定范围为1-999。
  • PERIDDS关键字用于指定作业执行次数,该值为一个整数,默认为1,可指定范围为1-999。
  • BYHOUR:指示定时作业在指定小时执行,可指定范围 0-23,若要指定多个时间参数使用逗号进行分割,如BYHOUR=2,5,7
  • BYDAY:指示在每周的第几天运行,可使用数字或英文缩写,如:MON|TUE|WED|THU|FRI|SAT|SUN等。
  • BYMONTHDAY:指示在每月的第几天运行。
  • BYMONTH:指示在每年的月份,可使用数字或英文缩写,如:JAN|FEB|MAR|APR|MAY|JUN等。
  • BYWEEKNO:指定在一年的哪一周运行,范围1-53。
  • BYYEARDAY:指定在一年的哪一天运行,范围1-366。
  • BYDATE:指定一年的哪一天运行,范围1-366,类型与BYYEARDAY不同。
  • BYMINUTE:指定在小时内的哪一分钟运行,范围0-59。
  • BYSECOND:指定在分钟内的哪一秒运行,范围0-59。

2.4 示例

  • 创建一个基于存储过程的定时作业
sql

SQL> create table JOB_TEST (id int, dt datetime);

SQL> CREATE OR REPLACE PROCEDURE JOB_PROC(INPUT INTEGER) IS
     BEGIN
       INSERT INTO JOB_TEST VALUES (INPUT, SYSDATE);
     END;
     /

-- 创建定时作业,在每天的5点与14点时,每隔30秒运行一次
SQL> EXEC DBMS_SCHEDULER.CREATE_JOB(
         'job',
         'stored_procedure',
         'JOB_PROC',
         1,
         sysdate,
         'freq=secondly;INTERVAL=30;byhour=5,14;',
         '2029-01-01 01:00:00',
         'JOB CLASS',
         FALSE,
         FALSE,
         '这是一个用于测试的定时作业'
     );
  • 基于PL/SQL块语句的定时作业
sql
-- 创建一个基于PLSQL块语句的定时作业,该定时作业在每天的5点与14点时,每隔30秒运行一次
SQL> EXEC DBMS_SCHEDULER.CREATE_JOB(
        'job2',
        'plsql_block',
        'DECLARE BEGIN FOR i IN 1..3 LOOP INSERT INTO JOB_TEST VALUES(i,sysdate);END LOOP;END;',
        0,
        sysdate,
        'freq=secondly;INTERVAL=30;byhour=5,14;',
        '2029-01-01 01:00:00',
        'default_class',
        FALSE,
        TRUE,
        '这是一个用于测试的定时作业'
    );

2.5 场景应用

  • 场景一:自动化备份任务:定期执行数据导出
  • 场景二:系统资源监控:每小时采集数据库会话、锁等待、I/O使用情况
  • 场景三:错峰任务安排,将重负载任务安排在夜间进行,减轻高峰期压力

三、ENABLE

3.1 功能描述

定时作业在创建时默认被禁用,该接口用于启用定时作业

3.2 方法声明

sql
PROCEDURE ENABLE(
    NAME    IN VARCHAR
    );

3.3 参数说明

参数名类型取值范围是否可选描述
NAMEVARCHAR定时作业名

3.4 示例

sql
-- 启用定时作业job2
SQL> exec DBMS_SCHEDULER.ENABLE('job2');

3.5 场景应用

  • 场景一:作业创建完毕但暂不执行,等业务准备好后手动启用
  • 场景二:分批启用任务,减轻系统瞬时负载

四、DISABLE

4.1 功能描述

该接口用于禁用指定的定时作业

4.2 方法声明

sql
PROCEDURE DISABLE(
    NAME        IN VARCHAR,
    FORCE       IN BOOLEAN DEFAULT FALSE
    );

4.3 参数说明

参数名类型取值范围是否可选描述
NAMEVARCHAR定时作业名
FORCEBOOLEANTRUE/FALSE是,默认值为FALSE是否强制关闭(该参数暂时不支持)

4.4 示例

sql
-- 禁用定时作业job2
SQL> exec DBMS_SCHEDULER.DISABLE('job2');

4.5 场景应用

  • 场景一:某个作业频繁失败或引发系统错误,运维可立即禁用作用避免影响
  • 场景二:节假日或夜间可禁用非必要任务节省资源
  • 场景三:调试系统问题时禁用可疑作业,排除干扰因素进行分析

五、RUN_JOB

5.1 功能描述

该接口用于手动执行定时作业,只会执行一次,不影响其原有的调度计划

5.2 方法声明

sql
PROCEDURE RUN_JOB (
   JOB_NAME                IN VARCHAR,
   USE_CURRENT_SESSION     IN BOOLEAN DEFAULT TRUE
   );

5.3 参数说明

参数名类型取值范围是否可选描述
JOB_NAMEVARCHAR定时作业名
USE_CURRENT_SESSIONBOOLEANTRUE/FALSE是,默认值为TRUEFALSE表示将作业添加到任务队列中异步执行;TRUE表示使用当前会话执行该作业

5.4 示例

sql
-- 执行定时作业job2
SQL> exec DBMS_SCHEDULER.RUN_JOB('job2');

5.5 场景应用

  • 场景一:创建完作业后,手动运行一次检查语法、依赖、权限是否都正确
  • 场景二:作业因调度失败或未启用导致未执行,可手动执行一次避免业务中断
  • 场景三:系统故障或维护期间错过调度,可手动补跑任务

六、DROP_JOB

6.1 功能描述

该接口用于删除定时任务,不再被调度器识别

6.2 方法声明

sql
PROCEDURE DROP_JOB (
   JOB_NAME          IN VARCHAR,
   FORCE             IN BOOLEAN DEFAULT FALSE
   );

6.3 参数说明

参数名类型取值范围是否可选描述
JOB_NAMEVARCHAR定时作业名
FORCEBOOLEANTRUE/FALSE是,默认值为FALSE是否强制删除(该参数暂时不支持)

提示

对于删除正在运行态的定时作业时,此时会返回警告信息,等待job完成后自动完成删除

6.4 示例

sql
-- 删除定时作业job
SQL> exec DBMS_SCHEDULER.DROP_JOB('job');

6.5 场景应用

  • 场景一:长期未启用、已废弃的历史作业会占用元数据和调度资源,需定期清理
  • 场景二:原任务逻辑需要重构或改新名称、新策略时,删除旧任务保持作业干净
  • 场景三:在搭建测试环境时,删除无用任务

七、JOB_NEXT_RUNTIME

7.1 功能描述

该接口根据作业的最近一次执行时间,计算作业的下次执行时间

7.2 方法声明

sql
FUNCTION  JOB_NEXT_RUNTIME(
  JOB_NAME         IN VARCHAR,
  LAST_RT          IN DATETIME
     ) RETURN DATETIME;

7.3 参数说明

参数名类型取值范围是否可选描述
JOB_NAMEVARCHAR定时作业名
LAST_RTDATETIME最近一次执行时间

7.4 示例

sql
-- 根据最近一次执行时间以及作业的调度频率,计算作业的下次执行时间
SQL> select dbms_scheduler.JOB_NEXT_RUNTIME('job2','2025-05-01 00:00:00');

+--------------------------+
|          EXPR1           |
+--------------------------+
| 2025-06-21 17:23:30.000  |
+--------------------------+

7.5 场景应用

  • 场景一:通过查看上次与下次执行时间,判断是否发生跳过、失败、延迟
  • 场景二:结合多个作业的下次执行时间推测并发压力,合理错峰调度
  • 场景三:如果某任务失败了,需人工或自动补跑,需要判断其下次执行时间
  • 场景四:计算下次执行时间,确认特定时间段没有任务执行

八、NEXT_RUNTIME

8.1 功能描述

该接口根据给定调度时间串和最近一次执行时间,计算下一次执行的时间

8.2 方法声明

sql
FUNCTION  NEXT_RUNTIME(
  REPEAT_INTERVAL   IN VARCHAR,
  LAST_RT           IN DATETIME
     ) RETURN DATETIME;

8.3 参数说明

参数名类型取值范围是否可选描述
REPEAT_INTERVALVARCHAR调度时间串,格式为:FREQ = XXX
LAST_RTDATETIME最近一次执行时间

8.4 示例

sql
-- 根据给定的调度时间串和最近一次执行时间,计算下一次执行的时间
SQL> select dbms_scheduler.NEXT_RUNTIME('FREQ=HOURLY;INTERVAL=1;','2025-05-01 00:00:00');

+--------------------------+
|          EXPR1           |
+--------------------------+
| 2025-06-21 18:00:00.000  |
+--------------------------+

8.5 场景应用

  • 场景一:某任务未如期执行,通过手动计算判断原计划时间是否如预期

九、SET_ATTRIBUTE

9.1 功能描述

该接口用于修改定时作业某个属性的值,不需要删除重建作业

9.2 方法声明

根据不同数据类型的属性值,可以有多种重载方式。

  • 重载形式一:指定值数据类型为VARCHAR2

    sql
    PROCEDURE SET_ATTRIBUTE (
        NAME           IN VARCHAR2,
        ATTRIBUTE      IN VARCHAR2,
        VALUE          IN VARCHAR2
        );
  • 重载形式二:指定值数据类型为TIMESTAMP

    sql
     PROCEDURE SET_ATTRIBUTE (
         NAME           IN VARCHAR2,
         ATTRIBUTE      IN VARCHAR2,
         VALUE          IN TIMESTAMP
         );
  • 重载形式三:指定值数据类型为PLS_INTEGER

    sql
     PROCEDURE SET_ATTRIBUTE (
         NAME           IN VARCHAR2,
         ATTRIBUTE      IN VARCHAR2,
         VALUE          IN PLS_INTEGER
         );
  • 重载形式四:指定值数据类型为BOOLEAN

    sql
     PROCEDURE SET_ATTRIBUTE (
         NAME           IN VARCHAR2,
         ATTRIBUTE      IN VARCHAR2,
         VALUE          IN BOOLEAN
         );

9.3 参数说明

参数名类型取值范围是否可选描述
NAMEVARCHAR2定时作业名
ATTRIBUTEVARCHAR2属性名
VALUEVARCHAR2/TIMESTAMP/PLS_INTEGER/BOOLEAN属性值

9.4 示例

sql
-- 修改定时作业job2的comments属性内容为'备份'
SQL> exec DBMS_SCHEDULER.SET_ATTRIBUTE('job2','comments','备份');

9.5 场景应用

  • 场景一:某任务调度集中导致资源紧张,修改其调度时间串,错峰执行

十、SET_JOB_ARGUMENT_VALUE

10.1 功能描述

该接口用于设置定时作业某个参数的值

10.2 方法声明

根据参数序号或参数名来设置值。根据参数值的不同数据类型,可以有多种重载方式。此处语法仅列出VARCHAR2类型作为参考。除此之外,ARGUMENT_VALUE还支持TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、NUMERIC、BOOLEAN、TIME、DATE、DATETIME数据类型

  • 重载形式一:根据参数序号,设置VARCHAR2类型的参数值

    sql
    PROCEDURE SET_JOB_ARGUMENT_VALUE(
        JOB_NAME            IN  VARCHAR2,
        ARGUMENT_POSITION   IN  PLS_INTEGER,
        ARGUMENT_VALUE      IN  VARCHAR2
        );
  • 重载形式二:根据参数名,设置VARCHAR2类型的参数值

    sql
    PROCEDURE SET_JOB_ARGUMENT_VALUE(
        JOB_NAME            IN  VARCHAR2,
        ARGUMENT_NAME       IN  VARCHAR2,
        ARGUMENT_VALUE      IN  VARCHAR2
        );

10.3 参数说明

参数名类型取值范围是否可选描述
JOB_NAMEVARCHAR2定时任务名
ARGUMENT_POSITIONPLS_INTEGER参数序号
ARGUMENT_NAMEVARCHAR2参数名
ARGUMENT_VALUE支持多种不同数据类型参数值
  • 其中ARGUMENT_VALUE支持以下数据类型:VARCHAR2、TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、NUMERIC、BOOLEAN、TIME、DATE、DATETIME

提示

非STORED_PROCEDURE类型的定时作业不允许设置参数

10.4 示例

sql
-- 创建存储过程pro_job3
SQL> CREATE OR REPLACE PROCEDURE pro_job3(dt DATETIME) IS
               BEGIN
               FOR i IN 1..10 LOOP
               INSERT INTO JOB_TEST VALUES(ADD_MONTHS(dt,i));
               END LOOP;
               END;
               /

-- 创建job3,执行体为pro_job3
SQL> EXEC DBMS_SCHEDULER.CREATE_JOB(
         'job3',
          'stored_procedure',
          'pro_job3',
          1,
          sysdate,
          'FREQ=secondly;INTERVAL=1;',
          sysdate + 1/24/60,
         'DEFAULT_JOB_CLASS',
          FALSE,
          TRUE,
          '这是一个测试'
          );

-- 对stored_procedure型的定时作业job3传入参数
SQL> exec DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('job3', 1, sysdate);

-- 对pl/sql型的定时作业job2传入参数
SQL> exec DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('job2', 1, sysdate);

Error: [E21024] 非STORED_PROCEDURE型JOBjob2不能设置参数

10.5 场景应用

  • 场景一:动态指定执行参数,可以实现运行相同逻辑但参数不同的任务,如统计不同地区的报表
  • 场景二:在测试环境中通过修改参数运行多个测试用例,模拟作业运行逻辑

相关系统表和视图