Oracle dbms_job 可以在指定的时间点或每天的某个时间点自行执行任务。可以在数据库级别上实现定时任务,用来定时调用存储过程是一个不错的解决方案。
语法
使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse。
dbms_job.submit(
job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。
what参数是将被执行的PL/SQL代码块,存储过程名称等。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
创建一个存储过程
create or replace procedure p_test_job is
begin
insert into aaaa_batchinfo
values
(AAAA_BATCHINFO_SEQ.nextval,
1,
sysdate(),
1,
sysdate());
end;
--需要调用一下,使得存储过程生效
call p_test_job();
创建 dbms_job
--新建 job 其中第二个参数;号必须带上
declare job_test number;
begin
-- sysdate+1 每天凌晨执行
dbms_job.submit(job_test,'p_test_job;',sysdate,'sysdate+1');
commit;
end;
关于 dbms_job 的一些常用命令
--查看所有的 job
select job,log_user,to_char(last_date,'yyyy-mm-dd hh24:mi:ss') last_date,
to_char(next_date,'yyyy-mm-dd hh24:mi:ss') next_date,interval,what
from user_jobs
--如果 last_date 没有值
--需要手动执行一次,这样才能正确的使 job 定时执行
execute dbms_job.run(25);
--删除 job
execute dbms_job.remove(25);
--job_queue_processes参数,当设定该值为0的时候则任意方式创建的job都不会运行。
show parameters job;
alter system set job_queue_processes = 6;
关于执行时间的一些参数
执行时间 | INTERVAL参数值 |
---|---|
每天凌晨0点执行 | TRUNC(SYSDATE + 1) |
每天早上8点执行 | TRUNC(SYSDATE + 1) +(860)/ (2460) |
每星期日中午12点 | NEXT_DAY(TRUNC(SYSDATE ),''SUNDAY'' ) + 12/24 |
每个月第一天的午夜12点 | TRUNC(LAST_DAY(SYSDATE ) + 1) |
本文由个人 hexo 博客 co2fe.com 迁移
date: 2017-10-15 12:33:31