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