DBMS_JOB 包

为了兼容ORACLE定时任务的创建,按指定的时间或间隔执行用户定义的作业。达梦提供了DBMS_JOB包以及DBA_JOBS、USER_JOBS视图来实现跟ORACLE类似的功能。

6.1 相关方法

  1. BROKEN过程

更新一个已提交的工作的状态,典型地是用来把一个已过期工作标记为未过期工作;或者把一个未过期的工作设置为何时过期。

语法如下:

PROCEDURE Broken(

  job in integer,

  broken in boolean,

  next_date in datetime :=SYSDATE

);

参数详解

  • job工作号,唯一标识一个特定工作。
  • broken指示此工作是否将标记为过期,TRUE或FALSE。TRUE表明过期,而FALSE表明未过期。
  • next_date指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。
  1. CHANGE过程

用来改变指定工作的设置。

语法如下:

PROCEDURE Change (

  job in integer,

  what in varchar2,

  next_date in datetime,

  interval in varchar2

);

参数详解

  • job工作号,唯一标识一个特定工作。
  • what是由此工作运行的一块PL/SQL代码块。
  • next_date指示何时此工作将被执行。
  • interval指示一个工作重执行的频度。

注意:

由于CHANGE是保留字,调用该过程时需要在过程名上加双引号。

  1. INTERVAL过程

用来显式地设置重执行一个工作之间的时间间隔数。

语法如下:

PROCEDURE Interval (

  job in integer,

  interval in varchar2

);

参数详解

  • job 工作号,唯一标识一个特定工作。
  • interval 指示一个工作重执行的频度,该频度是一个日期表达式字符串,以当天0点0分为起点和该日期表达式字符串计算出来的日期时间之差,以分钟为最小间隔单位。例如’sysdate+1/1440’,则表示间隔1分钟,’sysdate + 1/24’则表示间隔1小时,’sysdate +1’则表示间隔1天,最多允许间隔100天。达梦的INTERVAL参数不支持以周,月,季等单位方式指定间隔。

注意:

由于INTERVAL是保留字,调用该过程时需要在过程名上加双引号。

  1. ISUBMIT过程

用来用特定的工作号提交一个工作。这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。

语法如下:

PROCEDURE ISubmit (

  job in integer,

  what in varchar2,

  next_date in datetime,

  interval in varchar2,

  no_parse in boolean:=FALSE

);

参数详解

  • job是由用户指定的工作编号,不能为负数,且必须是不存在的工作编号。
  • what是将被执行的PL/SQL代码块。
  • next_date指示何时将运行这个工作。
  • interval何时这个工作将被重执行。
  • no_parse指示此工作在提交时或执行时是否应进行语法分析,TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
  1. NEXT_DATE过程

用来显式地设定一个工作的执行时间。

语法如下:

PROCEDURE Next_Date(

  job in integer,

  next_date in datetime

);

参数详解

  • job标识一个已存在的工作。
  • next_date指示了此工作应被执行的日期与时间。
  1. REMOVE过程

用来删除一个已计划运行的工作。已正在运行的工作不能由调用过程序删除。

语法如下:

PROCEDURE Remove(

  job in integer

);

参数详解

  • job唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。
  1. RUN过程

用来立即执行一个指定的工作。需要说明的是,RUN过程的调用不影响工作的计划运行时间。

语法如下:

PROCEDURE Run(

  job in integer

);

参数详解

job标识将被立即执行的工作。

  1. SUBMIT过程

使用Submit()过程,工作被正常地计划好。

语法如下:

PROCEDURE Submit (

  job out integer,

  what in varchar2,

  next_date in date,

  interval in varchar2,

  no_parse in boolean:=FALSE

);

参数详解

  • job 是由Submit()过程返回的工作编号。这个值用来唯一标识一个工作。
  • what 是将被执行的PL/SQL代码块。
  • next_date 指识何时将运行这个工作。
  • interval 何时这个工作将被重执行。
  • no_parse 指示此工作在提交时或执行时是否应进行语法分析,TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
  1. WHAT过程

允许在工作执行时重新设置此正在运行的命令。

语法如下:

PROCEDURE What (

  job in integer,

  what in out varchar2

);

参数详解

  • job标识一个存在的工作。
  • what指示将被执行的新的PL/SQL代码,如果传入的what参数值为空串,那将返回该任务原来的PL/SQL代码。

6.2 DBMS_JOB视图

  1. BDA_JOBS视图

描述数据库中所有的JOB。

序号 数据类型 说明
1 JOB INTEGER 工作的唯一标识号
2 LOG_USER VARCHAR(8188) 提交工作的用户
3 PRIV_USER VARCHAR(8188) 赋予工作权限的用户
4 SCHEMA_USER VARCHAR(8188) 对工作做语法分析的用户模式
5 LAST_DATE DATE 最后一次成功运行工作的时间
6 LAST_SEC TIME(0) HH:MM:SS格式的LAST_DATE的时间
7 THIS_DATE DATE 正在运行工作的开始时间
8 THIS_SEC TIME(0) HH:MM:SS格式的THIS_DATE的时间
9 NEXT_DATE DATE 下一次定时任务运行的时间
10 NEXT_SEC TIME(0) HH:MM:SS格式的NEXT_DATE的时间
11 TOTAL_TIME FLOAT 该job运行所需的总时间
12 BROKEN VARCHAR(1) 是否工作中断标识参数,Y是,N否
13 INTERVAL INTEGER 用于计算下一运行时间的表达式
14 FAILURES BIGINT 工作运行连续没有成功的次数
15 WHAT VARCHAR(1800) 执行工作的PL/SQL块
16 NLS_ENV VARCHAR(1) 工作运行的NLS会话设置
17 MISC_ENV VARCHAR(1) 工作运行的其他一些会话参数
18 INSTANCE INTEGER 能够运行或正在运行工作的实例的id号。 单节点上默认值为1,如果是DM MPP或DMDSC环境。 默认值为实例序号加1。

2.USER_JOBS视图

描述当前用户所拥有的JOB。视图结构与DBA_JOBS相同。

3.DBA_JOBS_RUNNING

显示实例中所有正在执行的作业。

序号 数据类型 说明
1 SID BIGINT 作业执行的SESSION的ID
2 JOB INTEGER 作业号
3 FAILURES INTEGER 作业自上一次成功以来的失败次数,暂不支持
4 LAST_DATE DATE 最后一次成功运行工作的时间
5 LAST_SEC TIME(0) HH:MM:SS格式的LAST_DATE的时间
6 THIS_DATE DATE 本次运行的开始时间
7 THIS_SEC TIME(0) HH:MM:SS格式的THIS_DATE的时间
8 INSTANCE INTEGER 能够运行或正在运行作业的实例的ID号。 单节点上默认值为1,如果是DM MPP或DMDSC环境,默认值为实例序号加1

6.3 创建、删除语句

创建或删除DBMS_JOB系统包。

语法如下:

void

SP_INIT_JOB_SYS(

    CREATE_FLAG int

)

参数详解

  • CREATE_FLAG

为1时表示创建DBMS_JOB包;为0表示删除该系统包。

返回值

举例说明

创建DBMS_JOB系统包。

SP_INIT_JOB_SYS(1);

6.4 举例说明

用户在使用DBMS_JOB包之前,需要提前调用系统过程SP_INIT_JOB_SYS(1),创建好调试所需要的包,就可以使用DBMS_JOB来调用PL/SQL中的过程或函数了。

SP_INIT_JOB_SYS(1);

创建测试表

create table a(a datetime);

创建一个自定义过程

create or replace procedure test as

begin

insert into a values(sysdate);

end;

/

创建JOB

begin

dbms_job.isubmit(1,'test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次

  commit;

end;

/

查看JOB运行结果

select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;

结果如下:

时间

2013/09/04 13:22:44

2013/09/04 13:23:44

2013/09/04 13:24:44

2013/09/04 13:25:44

删除JOB

begin

dbms_job.remove(1);

end;

/

PL/SQL过程已成功完成。

微信扫码
分享文档
扫一扫
联系客服