VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DBMS_JOB

功能描述

DBMS_JOB包用于安排和管理作业队列。通过作业队列,可以使数据库定期执行特定的任务。

注意事项

  • 暂时不支持远程连接执行定时任务的方式。

  • 部分特性仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用。详见内置包子程序

  • GUC参数enable_prevent_job_task_startup参数用于控制是否启动job线程。

兼容性

Vastbase G100 V2.2版本与Oracle 11g R2版本相比,不支持的函数有:INSTANCE、INTERVAL、NEXT_DATE、USER_EXPORT、WHAT。

子程序

表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

参数说明

  • 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);