复习oracle中的dbms_job包
oracle中的DBMS_JOB包提供了定时周期性执行job队列中的job的功能,虽然它在oracle11g中已经被DBMS_SCHEDULER所取代,但是因为很多legacy application中还是大量地用到了它,所以在这里复习一下。
DBMS_JOB.SUBMIT用来提交一个job到job队列中,用法如下所示:
1 2 3 4 5 6 7 8 9 10 11 | DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X, what => 'SYSTEM.INSERTDATE;', next_date => SYSDATE, INTERVAL => 'SYSDATE+0.1/(24*60)' ); COMMIT; END; |
其中job是一个out类型的参数,它返回的是一个具体job的id,以后可以通过这个id来引用job对它进行进一步的操作。
what指定要执行的任务,注意它是VARCHAR2类型的,要写在单引号中,另外注意单引号中的分号。
next_date指明了当你把job submit到job队列中后这个job什么时候开始第一次执行,如果是SYSDATE,那么说明当job一被提交到job队列中就立刻开始第一次执行。
INTERVAL的类型是VARCHAR2,它在每次job将要执行之前被重新计算,计算得到的结果会被赋给next_date,指明了job下一次被执行的时间。下面是几个interval的例子:
TRUNC(SYSDATE+1) 每天的零点 TRUNC(SYSDATE+7) 每过七天后的第一个零点 NEXT_DAY(TRUNC(SYSDATE), 'SUNDAY') 每个星期天的零点 TRUNC(SYSDATE+1)+6/24 每天的早上六点 SYSDATE+30/1440 每三十分钟 SYSDATE+1/(24*60) 每一分钟
如果要改变一个job的属性,可以用DBMS_JOB.CHANGE这个方法,如下所示:
1 2 3 4 5 6 7 8 9 | BEGIN DBMS_JOB.CHANGE ( job => 70, what => 'SYSTEM.INSERTDATE;', next_date => SYSDATE, INTERVAL => 'SYSDATE+0.5/(24*60)' ); COMMIT; END; |
其中what, next_date, interval可以是null, 表示延用以前设定的值。
如果想让一个你设定好定时执行的时job临时停止执行,可以使用DBMS_JOB.BROKEN这个方法,它可以设定job的broken标记。如下例所示,把id为72的job的状态为broken,这个它就永远不会再执行了。
1 2 3 4 5 6 7 8 | BEGIN DBMS_JOB.BROKEN ( job => 72, broken => TRUE, next_date => SYSDATE ); COMMIT; END; |
想要把一个job从job队列中移除(相当于删除它),可以用DBMS_JOB.REMOVE方法,如下所示:
1 2 3 4 | BEGIN DBMS_JOB.REMOVE(72); COMMIT; END; |
如果一个job的预定执行时间还没有到,而你想让它立刻执行,那么你可以用DBMS_JOB.RUN方法,它甚至可以让状态为broken的job立刻执行,如下所示:
1 2 3 | BEGIN DBMS_JOB.RUN(71); END; |
查询job队列中有哪些job可以用下面的语句,注意要想对dba_jobs做查询,用户要有在SYS.DBA_JOBS上SELECT的权限。
1 | SELECT * FROM dba_jobs; |
同样oracle也提供了一个view可以查看有哪些job是正在运行中的,如下:
1 | SELECT * FROM dba_jobs_running; |