在Java中有定时任务这一概念,也有很多的任务调度框架,在Oracle中,也有定时任务,就是Job。
1.什么情况下会使用job
job一般用来定时执行一些操作,比如执行一些存储过程。
2.简单使用job
在这里,简单介绍一下,怎样使用JOB
2.1 新建一个测试表
就2个简单的字段:id 和创建时间
create table t_ygy_demo_hellojob
(
id number,
createtime date
)
2.2 创建一个序列
上面的表中,ID自增
create sequence s_ygy_demo_hellojob
minvalue 1
maxvalue 999999999
start with 1
increment by 1
cache 20;
2.3 创建存储过程
这里的存储过程,用来插入一条记录。
create or replace procedure proc_ygy_demo_hellojob
as
begin
insert into t_ygy_demo_hellojob(id , createtime) values(s_ygy_demo_hellojob.nextval , sysdate);
end;
到这里为止,都很顺利,下面就要开始JOB相关的了。
2.4 创建JOB
declare job number;
begin
sys.dbms_job.submit(job,'proc_ygy_demo_hellojob;',sysdate,'sysdate+1/1440');
end;
这里使用了dbms_job 包下的子过程 submit();
这里简要说明一下 submit()过程:
PROCEDURE Submit ( job OUT binary_ineger,
what IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
job:由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作
what:要执行的存储过程(PL/SQL代码块)
next_date: 下一次要执行的时间
interval:该JOB重复执行的频度
no_parse: 为TRUE表示此PL/SQL代码在它第一次执行时应进行语法分析, 而FALSE表示本PL/SQL代码应立即进行语法分析。默认为false
到这一步的时候,并该JOB并没有执行,还需要下一步。
2.5 运行JOB
begin
sys.dbms_job.run(263);
end;
这里使用了dbms_job包下的子过程 run();
这里说明一下run()过程:
PROCEDURE Run(job IN binary_ineger)
这里只有一个参数,就是要运行的JOB的编号,这是唯一的。
如示例中的263,就是我这里job的ID。
执行完这一步,定时任务已经开始了,上面的任务是1分钟执行一次,可以查询创建的表来看数据记录。
3. DBMS_JOB包下的子过程介绍
3.1 查看系统中的JOB
SELECT *FROM USER_JOBS;
通过这里命令,可以查看所有的JOB,还有在上面运行JOB的时候,需要一个JOB的ID,也可以通过这里命令得到。
3.2 删除一个JOB
dbms_job.remove(jobno);
3.3 修改JOB执行的存储过程
dbms_job.what(jobno,what);
3.4 修改下次执行时间
dbms_job.next_date(jobno,next_date);
3.5 修改执行频度
dbms_job.interval(jobno,interval);
3.6 停止JOB
begin
sys.dbms_job.broken(jobno,true);
end;