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_NAME | VARCHAR2 | 无 | 否 | 任务名 |
JOB_TYPE | VARCHAR2 | PLSQL_BLOCK/STORED_PROCEDURE | 否 | 执行体类型,当前支持块语句(PLSQL_BLOCK)和存储过程(STORED_PROCEDURE) |
JOB_ACTION | VARCHAR2 | 无 | 否 | 任务执行体 |
NUMBER_OF_ARGUMENTS | PLS_INTEGER | [0,100] | 是,默认为0 | 执行体参数个数 |
START_DATE | TIMESTAMP | 无 | 是,默认为NULL | 任务开始时间,开始时间应小于结束时间 |
REPEAT_INTERVAL | VARCHAR2 | 无 | 是,默认为NULL | 调度时间串设置,格式为:'FREQ=XXX; INTERVAL=XXX;...',用于设置频率、间隔等 |
END_DATE | TIMESTAMP | 无 | 是,默认为NULL | 任务结束时间,结束时间应大于当前系统时间,为NULL表示永远不会结束 |
JOB_CLASS | VARCHAR2 | 无 | 是,默认为DEFAULT_JOB_CLASS | 作业类型,暂无意义,预留 |
ENABLED | BOOLEAN | TRUE/FALSE | 是,默认为FALSE | 是否禁止 |
AUTO_DROP | BOOLEAN | TRUE/FALSE | 是,默认为TRUE | 作业执行完是否自动删除 |
COMMENTS | VARCHAR2 | 无 | 是,默认为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 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
NAME | VARCHAR | 无 | 否 | 定时作业名 |
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 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
NAME | VARCHAR | 无 | 否 | 定时作业名 |
FORCE | BOOLEAN | TRUE/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_NAME | VARCHAR | 无 | 否 | 定时作业名 |
USE_CURRENT_SESSION | BOOLEAN | TRUE/FALSE | 是,默认值为TRUE | FALSE表示将作业添加到任务队列中异步执行;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_NAME | VARCHAR | 无 | 否 | 定时作业名 |
FORCE | BOOLEAN | TRUE/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_NAME | VARCHAR | 无 | 否 | 定时作业名 |
LAST_RT | DATETIME | 无 | 否 | 最近一次执行时间 |
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_INTERVAL | VARCHAR | 无 | 否 | 调度时间串,格式为:FREQ = XXX |
LAST_RT | DATETIME | 无 | 无 | 最近一次执行时间 |
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
sqlPROCEDURE SET_ATTRIBUTE ( NAME IN VARCHAR2, ATTRIBUTE IN VARCHAR2, VALUE IN VARCHAR2 );
重载形式二:指定值数据类型为TIMESTAMP
sqlPROCEDURE SET_ATTRIBUTE ( NAME IN VARCHAR2, ATTRIBUTE IN VARCHAR2, VALUE IN TIMESTAMP );
重载形式三:指定值数据类型为PLS_INTEGER
sqlPROCEDURE SET_ATTRIBUTE ( NAME IN VARCHAR2, ATTRIBUTE IN VARCHAR2, VALUE IN PLS_INTEGER );
重载形式四:指定值数据类型为BOOLEAN
sqlPROCEDURE SET_ATTRIBUTE ( NAME IN VARCHAR2, ATTRIBUTE IN VARCHAR2, VALUE IN BOOLEAN );
9.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
NAME | VARCHAR2 | 无 | 否 | 定时作业名 |
ATTRIBUTE | VARCHAR2 | 无 | 否 | 属性名 |
VALUE | VARCHAR2/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类型的参数值
sqlPROCEDURE SET_JOB_ARGUMENT_VALUE( JOB_NAME IN VARCHAR2, ARGUMENT_POSITION IN PLS_INTEGER, ARGUMENT_VALUE IN VARCHAR2 );
重载形式二:根据参数名,设置VARCHAR2类型的参数值
sqlPROCEDURE SET_JOB_ARGUMENT_VALUE( JOB_NAME IN VARCHAR2, ARGUMENT_NAME IN VARCHAR2, ARGUMENT_VALUE IN VARCHAR2 );
10.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
JOB_NAME | VARCHAR2 | 无 | 否 | 定时任务名 |
ARGUMENT_POSITION | PLS_INTEGER | 无 | 否 | 参数序号 |
ARGUMENT_NAME | VARCHAR2 | 无 | 否 | 参数名 |
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 场景应用
- 场景一:动态指定执行参数,可以实现运行相同逻辑但参数不同的任务,如统计不同地区的报表
- 场景二:在测试环境中通过修改参数运行多个测试用例,模拟作业运行逻辑