oracle数据库对象-jobs

jobs是oracle数据库对象之一,定时任务。通过调用存储过程dbms_job.submit将任务加入到任务队列中。

查看dbms_job包,它有两个存储过程:

PROCEDURE isubmit ( job IN BINARY_INTEGER,
                    what IN VARCHAR2,
                    next_date IN DATE,
                    interval IN VARCHAR2 DEFAULT 'null',
                    no_parse IN BOOLEAN DEFAULT FALSE);
-- Submit a new job with a given job number.

PROCEDURE 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,

-- Bug 1346620: replace pkg vars with constants.
-- Default for instance = dbms_job.any_instance.
                  instance IN  BINARY_INTEGER DEFAULT 0,
                  force IN  BOOLEAN DEFAULT FALSE );
-- Submit a new job.  Chooses JOB from the sequence sys.jobseq.
-- instance and force are added for jobq queue affinity
-- If FORCE is TRUE, then any positive  integer is acceptable as the job
-- instance. If FORCE is FALSE, then the specified instance must be running;
-- otherwise the routine raises an exception.
-- For example,
--   variable x number;
--   execute dbms_job.submit(:x,'pack.proc(''arg1'');',sysdate,'sysdate+1');


注意我们用的是PROCEDURE submit这个存储过程。

1、基本语法

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


说明:
job:输出变量,是此任务在任务队列中的编号
what:执行的存储过程或sql语句
next_date:任务第一次执行的时间
interval:注意不是每次执行的间隔时间,而是下一次的执行时间,在本次执行之前对这个表达式求值算出下一次执行时间,所以一般都是sysdate加多少算出来的。

一般我们只要改前4个参数就可以了,任务下一次执行时间是在,本次任务开始时计算出来的。

2、创建测试表

create table JOB_TEST(a date);

3、创建语句

--/
DECLARE
jobtest number;
begin
dbms_job.submit (
job => jobtest,
what => 'insert into JOB_TEST values(sysdate);',
next_date => sysdate+0.01,
interval => 'sysdate+1/24'
);
end;
/

如果next_date填写sysdate,jobs会立即执行一次。

next_date也可使用to_data()函数来格式化时间,这样时间更精确:
next_date => to_date(‘20150623110000′,’YYYY:MM:DD HH24:MI:SS’),以此来设置一个起始时间。

4、移除计划任务
remove中填写jobs的id。

--/
begin
dbms_job.remove(101);
end;
/

5、强制执行计划任务

--/
begin
dbms_job.run(101,true);
end;
/

参考资料:
http://wallimn.iteye.com/blog/519924