为了兼容ORACLE定时任务的创建,按指定的时间或间隔执行用户定义的作业。达梦提供了DBMS_JOB包以及DBA_JOBS、USER_JOBS视图来实现跟ORACLE类似的功能。
6.1 相关方法
- BROKEN过程
更新一个已提交的工作的状态,典型地是用来把一个已过期工作标记为未过期工作;或者把一个未过期的工作设置为何时过期。
语法如下:
PROCEDURE Broken(
job in integer,
broken in boolean,
next_date in datetime :=SYSDATE
);
参数详解
- job工作号,唯一标识一个特定工作。
- broken指示此工作是否将标记为过期,TRUE或FALSE。TRUE表明过期,而FALSE表明未过期。
- next_date指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。
- CHANGE过程
用来改变指定工作的设置。
语法如下:
PROCEDURE Change (
job in integer,
what in varchar2,
next_date in datetime,
interval in varchar2
);
参数详解
- job工作号,唯一标识一个特定工作。
- what是由此工作运行的一块PL/SQL代码块。
- next_date指示何时此工作将被执行。
- interval指示一个工作重执行的频度。
注意:
由于CHANGE是保留字,调用该过程时需要在过程名上加双引号。
- 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是保留字,调用该过程时需要在过程名上加双引号。
- 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代码应立即进行语法分析。
- NEXT_DATE过程
用来显式地设定一个工作的执行时间。
语法如下:
PROCEDURE Next_Date(
job in integer,
next_date in datetime
);
参数详解
- job标识一个已存在的工作。
- next_date指示了此工作应被执行的日期与时间。
- REMOVE过程
用来删除一个已计划运行的工作。已正在运行的工作不能由调用过程序删除。
语法如下:
PROCEDURE Remove(
job in integer
);
参数详解
- job唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。
- RUN过程
用来立即执行一个指定的工作。需要说明的是,RUN过程的调用不影响工作的计划运行时间。
语法如下:
PROCEDURE Run(
job in integer
);
参数详解
job标识将被立即执行的工作。
- 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代码应立即进行语法分析。
- WHAT过程
允许在工作执行时重新设置此正在运行的命令。
语法如下:
PROCEDURE What (
job in integer,
what in out varchar2
);
参数详解
- job标识一个存在的工作。
- what指示将被执行的新的PL/SQL代码,如果传入的what参数值为空串,那将返回该任务原来的PL/SQL代码。
6.2 DBMS_JOB视图
- 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过程已成功完成。