DBMS_JOB
功能描述
DBMS_JOB包用于安排和管理作业队列。通过作业队列,可以使数据库定期执行特定的任务。
注意事项
暂时不支持远程连接执行定时任务的方式。
部分特性仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用。详见内置包子程序。
GUC参数enable_prevent_job_task_startup参数用于控制是否阻止job线程的启动。
DBMS_JOB.CHANGE函数仅在下列版本中支持:
- V2.2 Build 10 (Patch No.11)及以后补丁版本。
- V2.2 Build 13及以后版本。
子程序
表1 DBMS_JOB支持的函数
函数 | 描述 |
---|---|
SUBMIT | 提交定时任务。 |
RUN | 立即运行定时任务。 |
CHANGE | 修改一个定时任务。 |
REMOVE | 移除一个定时任务。 |
BROKEN | 停止或启动一个定时任务。 |
SUBMIT函数
功能描述
提交定时任务。
语法格式
--语法1
DBMS_JOB.SUBMIT (
in id bigint,
in content text,
in next_date timestamp without time zone default sysdate,
in interval text default 'null',
out job integer);
--语法2
DBMS_JOB.SUBMIT (
job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE DEFAULT sysdate,
interval IN VARCHAR2 DEFAULT 'null',
no_parse IN BOOLEAN DEFAULT FALSE,
instance IN BINARY_INTEGER DEFAULT any_instance,
force IN BOOLEAN DEFAULT FALSE);
- 语法2在传参时使用
参数名=>参数值
的写法,该用法仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。参见示例1。- 语法2的用法仅在V2.2 Build 10 (Patch No.11)及以后补丁版本,和V2.2 Build 13及以后版本中支持。
参数说明
id
输入参数,定时任务唯一标识。
content
定时运行的sql命令。
job
输出参数,输出正在运行的作业编号(id)。
what
指定需要运行的定时任务内容。
next_date
下一次job的运行时间,默认为sysdate,表示当即执行一次任务。
interval
时间间隔。默认为 null,即只执行一次。
no_parse
标记参数,默认为false。
设置为 true 表示数据库会在首次运行该作业时解析与该作业相关联的过程。
instance
实例。提交作业后,指定可以运行该作业的实例(支持该参数传入,但忽略该参数,并不进行校验)。
force
默认为false,指定实例必须是正在运行的。
该参数设置为true时表示任何正整数都可被接受为作业实例。(支持该参数传入,但忽略该参数,并不进行校验)。
RUN函数
功能描述
立即运行定时任务。
语法格式
DBMS_JOB.RUN (
job IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
参数说明
- job:需要运行的作业编号。
- force:该参数设置为true 时表示任何实例环境与在进程中与运行的作业无关,如果设置为false,则只能在指定实例中运行作业(支持该参数传入,但不校验并忽略该参数)。
CHANGE函数
功能描述
修改一个定时任务。
语法格式
DBMS JOB.CHANGE(JOB IN BINARY INTEGER,
what IN VARCHAR2 DEFAULT NULL,
next date IN DATE DEFAULT NULL,
interval IN VARCHAR2 DEFAULT NULL,
instance IN BINARY_INTEGER DEFAULT NULL,
force IN BOOLEAN DEFAULT FALSE);
注意事项
DBMS_JOB.CHANGE函数仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
参数说明
job
输出参数,输出正在运行的作业编号(job id)。
what
指定需要运行的定时任务内容。
next_date
下一次job的运行时间,默认为sysdate。
interval
时间间隔,默认为 null。
instance
实例。提交作业后,指定可以运行该作业的实例(支持该参数传入,但忽略该参数,并不进行校验)。
force
默认为false,指定实例必须是正在运行的。
该参数设置为true时表示任何正整数都可被接受为作业实例。(支持该参数传入,但忽略该参数,并不进行校验)。
REMOVE函数
功能描述
移除一个定时任务。
语法格式
DBMS_JOB.REMOVE (
job IN BINARY_INTEGER);
参数说明
job:需要删除的作业编号。
BROKEN函数
功能描述
停止或启动一个定时任务。
语法格式
DBMS_JOB.BROKEN (
job IN BINARY_INTEGER,
Broken IN BOOLEAN,
next_date IN DATE DEFAULT sysdate);
参数说明
- job:作业编号。
- broken:boolean类型,设置为true表示停止或者禁用作业任务,false则表示不中断(broken)作业任务。
- next_date:任务作业运行的下一个日期。
示例
示例1: 在Oracle兼容模式下进行定时任务的创建和管理。
1、使用vsql工具连接至客户端。
vsql -d vastbase -p 5432 -r
2、创建并切换至兼容模式为Oracle的数据库db_oracle下。
CREATE DATABASE db_oracle dbcompatibility='A';
\c db_oracle
3、设置参数enable_prevent_job_task_startup为off,表示可以启动job线程。
ALTER SYSTEM SET enable_prevent_job_task_startup TO off;
4、创建测试表。
create table t_test(insert_date timestamp);
5、创建存储过程,用于向测试表中插入数据。
create or replace procedure p_test()
as
begin
insert into t_test values(sysdate);
COMMIT;
end;
/
6、创建定时任务,每分钟执行一次。(创建定时任务时当即执行一次任务。)
DECLARE
JOB_NUM NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB=>JOB_NUM,
WHAT => 'p_test;',
NEXT_DATE => SYSDATE,
INTERVAL => 'TRUNC(SYSDATE,''MI'')+(1)/(24*60)'); --每分钟执行一次
COMMIT;
END;
/
7、查看测试表内容:
select * from t_test;
返回结果如下,有一条数据。
insert_date
---------------------
2023-05-24 15:03:31
(1 row)
8、调用DBMS_JOB.RUN函数立即执行任务。
DECLARE
JOB_NUM NUMBER;
BEGIN
SELECT A.JOB INTO JOB_NUM FROM DBA_JOBS A WHERE WHAT = 'p_test;';
dbms_job.run(JOB_NUM);
COMMIT;
END;
/
9、查看任务执行情况。
select * from t_test;
返回结果为:
insert_date
---------------------
2023-05-24 15:03:31
2023-05-24 15:03:44
(2 rows)
10、休眠1分钟。
select pg_sleep(60);
11、再次查看测试表内容,检查定时任务是否按时执行。
select * from t_test;
返回结果如下:
insert_date
---------------------
2023-05-24 15:03:31
2023-05-24 15:03:44
2023-05-24 15:04:00
(3 rows)
12、调用DBMS_JOB.CHANGE修改定时任务的名称,将p_test改为newname。
DECLARE
JOB_NUM NUMBER;
BEGIN
SELECT A.JOB INTO JOB_NUM FROM DBA_JOBS A WHERE WHAT = 'p_test;';
dbms_job.change(JOB_NUM,'newname;',sysdate,'''1min''::interval');
COMMIT;
END;
/
13、查看任务当前执行状态,查询时指定任务名称为newname。
select broken from dba_jobs where what ='newname;';
返回结果如下,表示任务正在进行中:
broken
--------
N
(1 row)
14、调用函数DBMS_JOB.BROKEN停止任务。
DECLARE
JOB_NUM NUMBER;
BEGIN
SELECT A.JOB INTO JOB_NUM FROM DBA_JOBS A WHERE WHAT = 'newname;';
DBMS_JOB.BROKEN(JOB_NUM,TRUE, SYSDATE);
COMMIT;
END;
/
15、再次查看任务状态:
select broken from dba_jobs where what ='newname;';
返回结果如下,表示任务处于停止状态:
broken
--------
Y
(1 row)
16、移除正在运行的任务:
DECLARE
JOB_NUM NUMBER;
BEGIN
SELECT A.JOB INTO JOB_NUM FROM DBA_JOBS A WHERE WHAT = 'newname;';
dbms_job.remove(JOB_NUM);
COMMIT;
END;
/
示例2: 在数据库中创建并管理定时任务,无数据库兼容模式要求。
1、使用vsql工具连接至客户端。
vsql -d vastbase -p 5432 -r
2、设置enable_prevent_job_task_startup参数为off(该参数用于控制是否启动job线程,设置为off表示可以启动job线程)。
ALTER SYSTEM SET enable_prevent_job_task_startup TO off;
3、创建测试表。
create table t_sub(insert_date timestamp);
4、创建一个向测试表中插入数据的定时任务,运行定时任务的时间间隔为1分钟。
select dbms_job.submit(1,'insert into t_sub values(sysdate);',sysdate,'''1min''::interval');
返回结果为:
submit
--------
1
(1 row)
5、查看测试表t_sub。
select * from t_sub;
返回结果为:
insert_date
---------------------
2023-05-24 15:17:48
(1 row)
6、休眠1分钟。
select pg_sleep(60);
7、再次查看测试表内容,检查定时任务的执行情况。
select * from t_sub;
返回结果如下,则表示定时任务执行成功:
insert_date
---------------------
2023-05-24 15:17:48
2023-05-24 15:18:48
(2 rows)
8、直接运行指定任务。
select dbms_job.run(1);
9、查看测试表内容,检查定时任务的执行情况。。
select * from t_sub;
返回结果为:
insert_date
---------------------
2023-05-24 15:17:48
2023-05-24 15:18:49
2023-05-24 15:19:38
(3 rows)
10、停止定时任务。
select dbms_job.broken(1,true);
11、移除正在运行的任务:
select dbms_job.remove(1);