Oracle的dbms_jobs 自动计划
oracel dbms_jobs包可以提交作业到作业队列中,这个包中还提供其它一些函数管理以前提交的作业,如对作业进行修改、禁止或删除等操作。
常用函数:
submit(),提交作业到作业队列。
isumbit(),
remove(),从作业队列中删除作业。
change(),改变已有作业的参数。
what(),改变作业要执行的代码。
next_date(),改变作业下一次执行时间。
interval(),改变作业执行的时间间隔。
broken(),暂停执行作业。
run(),强制执行作业。
最常用的submit()函数:
dbms_jobs.submit(
job out binary_integer,
what in varchar2,
next_date in date default sysdate,
interval in varchar default null,
no_parse in boolean default false,
instance in binary_integer default any_instance,
force in boolean default false
);
submit函数参数:
job,作业的作业号,是个输出参数,所以调用submit函数时,这个参数要指定一个已存在的变量。
what,作业要执行的代码,一般是存储过程。
next_date,下一次作业运行的日期。
interval,作业执行的间隔时间,这个参数默认值是null,也就是what指定的代码只在next_date这一时间执行一次。
no_parse,默认值是false,当参数值是false,提交作业时就对what指定的代码进行语法分析;当参数值是true,第一次运行what指定代码时才进行语法分析。
instance,指明运行作业的数据库实例。
force,如果是true,instance可以是任何正数;如果是false,instance指定的实例必须正在运行。
示例:
var jobno number;
begin
dbms_job.submit(:jobno,'pro_name;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18点执行
commit;
end;
上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口
这样就会在每天的18点执行存储过程pro_name。
---------------------------------------------------------------------------------------------------------------------------
用法DEMO:
DBMS_JOB.SUBMIT(:jobno,//job号
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
附:调用语句和参数说明:
dbms_job.submit( job out binary_integer,
what in archar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
其中:
● job:输出变量,是此任务在任务队列中的编号;
● what:执行的任务的名称及其输入参数;
● next_date:任务执行的时间;
● interval:任务执行的时间间隔。
DEMO示例:
declarejobid number;
v_sql varchar2(2000);
begin
v_sql:='begin
if to_char(sysdate,''HH24:MI'')=''15:30'' then -- 15:30执行
insert into rjck.rkjl(cksj) select cksj from wzcs.ckjl;
dbms_output.put_line(''inserted success'');
end if;
commit;
exception
when others then
rollback;
dbms_output.put_line(SQLERRM);
end;
';
dbms_job.submit(jobid,v_sql,sysdate,'sysdate+1/1440');
dbms_job.run(jobid);
dbms_output.put_line('job '||to_char(jobid)||' is running');
end;