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