温故而知新,可以为师矣

类别‘plsql’中的内容

复习oracle中的dbms_job包

作者:admin 时间:12.26.2009 类别:oracle, plsql

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;
1 / 11