文档基于Oracle 11.2版本

DBMS_JOB包介绍

Oracle推荐使用DBMS_SCHEDULER程序包来替代DBMS_JOB程序包。

DBMS_JOB程序包主要是调度和管理作业队列中的作业。换句话说,其实就是用来管理定时任务的程序包。
DBMS_JOB程序包中主要有以下存储过程:

  • BROKEN
  • CHANGE
  • INSTANCE
  • INTERVAL
  • NEXT_DATE
  • REMOVE
  • RUN
  • SUBMIT
  • USER_EXPORT
  • WHAT

    BROKEN

    broken存储过程永久的禁用job的执行。

    如果在job运行时禁用,则Oracle会在job运行结束后将broken自动重置为false,也就是job不会被禁用。 如果作业连续失败16次,Oracle会自动将job设置为true,也就是会禁用该job。

语法:

  1. DBMS_JOB.BROKEN (
  2. job IN BINARY_INTEGER,
  3. broken IN BOOLEAN,
  4. next_date IN DATE DEFAULT SYSDATE);

参数:

  • job 定时任务的标识符ID。
  • broken 设置定时任务是否禁用。设置为true表示禁用,false表示启用。
  • next_date 定时任务的下一次运行时间。

示例:

begin
  dbms_job.broken(204,true);
  commit;
end;

CHANGE

change存储过程更改job的参数值。
语法:

DBMS_JOB.CHANGE ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE,
   interval  IN  VARCHAR2,
   instance  IN  BINARY_INTEGER DEFAULT NULL,
   force     IN  BOOLEAN DEFAULT FALSE);

参数:

  • job 定时任务的标识符ID。
  • what 要运行的PL/SQL存储过程。
  • next_date job下一次要运行的时间。
  • interval job运行的时间间隔。
  • instance 执行job的实例;默认值为null,表示当前实例(当前参数不做任何改变)。
  • force 实例是否验证。如果为true,则指定的实例必须正在运行,否则,该存储过程会报错;如果为false(默认值),则任何正整数都可以作为job实例。(包括null)

示例:

begin
  dbms_job.change(210,null,null,'sysdate+30/86400',1,true);
  commit;
end;

INSTANCE

instance存储过程更改job的运行实例。
语法:

DBMS_JOB.INSTANCE ( 
   job        IN BINARY_INTEGER,
   instance   IN BINARY_INTEGER,
   force      IN BOOLEAN DEFAULT FALSE);

参数:

  • job 定时任务的标识符ID。
  • instance 执行job的实例;默认值为null,表示当前实例(当前参数不做任何改变)。
  • force 实例是否验证。如果为true,则指定的实例必须正在运行,否则,该存储过程会报错;如果为false(默认值),则任何正整数都可以作为job实例。(包括null)。

示例:

begin
  dbms_job.instance(210,1,false);
  commit;
end;

INTERVAL

interval存储过程更改job的运行间隔。

如果interval参数值为null,则该job在下一次成功执行后自动从队列中删除。(自动删除该job)

语法:

DBMS_JOB.INTERVAL ( 
   job       IN  BINARY_INTEGER,
   interval  IN  VARCHAR2);

参数:

  • job 定时任务的标识符ID。
  • interval job运行的时间间隔。(interval参数必须计算为将来的某个时间。)

示例:

begin
  dbms_job.interval(211,null);
  commit;
end;

NEXT_DATE

next_date存储过程更改job下一次运行的时间。
语法:

DBMS_JOB.NEXT_DATE ( 
   job       IN  BINARY_INTEGER,
   next_date IN  DATE);

参数:

  • job 定时任务的标识符ID。
  • next_date 下一次执行的时间。

示例:

begin
  dbms_job.next_date(211,sysdate+1);
  commit;
end;

REMOVE

remove存储过程移除现在的job。

正在执行的job不会被删除

语法:

DBMS_JOB.REMOVE ( 
   job       IN  BINARY_INTEGER );

参数:

  • job 定时任务的标识符ID。

示例:

begin
  dbms_job.next_date(211,sysdate+1);
  commit;
end;

RUN

run存储过程执行job。

即使broken设置为true,也会运行

语法:

DBMS_JOB.RUN ( 
   job       IN  BINARY_INTEGER,
   force     IN  BOOLEAN DEFAULT FALSE);

参数:

  • job 定时任务的标识符ID。
  • force 如果为true,则当前实例不需要和job中指定的实例一致。如果为false,则当前实例必须与job指定的实例一致才能够运行。

示例:

begin
  dbms_job.run(213,false);
  commit;
end;

SUBMIT

submit存储过程创建一个job。
语法:

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

参数:

  • job 定时任务的标识符ID。
  • what 要运行的PL/SQL存储过程或代码块。
  • next_date job下一次要运行的时间。
  • interval job运行的时间间隔。
  • no_parse 如果设置为false(默认值),则Oracle解析job中的存储过程。如果设置为true,则Oracle在第一次运行时解析job中的存储过程。
  • instance 执行job的实例;默认值为null,表示当前实例(当前参数不做任何改变)。
  • force 实例是否验证。如果为true,则指定的实例必须正在运行,否则,该存储过程会报错;如果为false(默认值),则任何正整数都可以作为job实例。(包括null)

示例:

declare 
WATER_JOB number;
begin
dbms_job.submit(
job=>WATER_JOB,
what=>'test_aa;',
next_date=>sysdate,
interval => 'sysdate+10/86400');
commit;
end;

USER_EXPORT

user_export存储过程导出job的文本。(导出job的语句)
语法:

DBMS_JOB.USER_EXPORT ( 
   job      IN     BINARY_INTEGER,
   mycall   IN OUT VARCHAR2,
   myinst   IN OUT VARCHAR2);

参数:

  • job 定时任务的标识符ID。
  • mycall 生成重新创建的job的文本。
  • myinst 生成更改实例的job调用文本。

示例:

declare
jobcall varchar2(3000); 
myinst varchar2(3000); 
begin
  dbms_job.user_export(223,jobcall,myinst);
  dbms_output.put_line(jobcall); 
  dbms_output.put_line(myinst);
  commit;
end;

结果如下:
image.png

WHAT

what存储过程更改job调用的存储过程。
语法:

DBMS_JOB.WHAT ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2);

参数:

  • job 定时任务的标识符ID。
  • what 要运行的PL/SQL存储过程。

示例:

begin
dbms_job.what(223,'sdsdf;');
commit;
end;