长期跟ETL(Extract & Transform & Load)过不去的数据攻城狮们总会遇到任务调度和监控问题,刨去商业ETL工具之外,ORACLE数据库还给我们提供了一份小作坊的解决方案:Job(定时任务)。下面来看看这一份简单例子:
1、新建一张表用于存放ETL结果
create table job_test(a VARCHAR2(200));
2、新建存储过程,向结果表写入数据
create or replace procedure proc_job_test as
begin
insert into job_test(a) values (to_char(sysdate, 'yyyyMMdd hh24:mi:ss'));
commit;
end;
3、创建Job定时任务,实现定时任务调度
BEGIN
DBMS_JOB.SUBMIT(
JOB => :job,
WHAT => 'proc_job_test;',
NEXT_DATE => to_date('23-10-2020 03:00:00', 'dd-mm-yyyy hh24:mi:ss'), --初次执行时间
INTERVAL => 'trunc(sysdate,'mi')+1/(24*60)' --每隔1分钟执行一次
);
commit;
end;
--实用配置:
0)NEXT_DATE => sysdate+3/(24*60)
1)INTERVAL => ‘trunc(sysdate,'mi')+1/(24*60)’ --每隔1分钟执行一次
2)INTERVAL => ‘TRUNC(SYSDATE+1)+(3*60)/(24*60)' --每天执行一次
每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24'
每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24'
每星期六和日早上6点10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
每3秒钟执行一次 'sysdate+3/(24*60*60)'
每2分钟执行一次 'sysdate+2/(24*60)'
Interval => 'TRUNC(sysdate,'mi') + 1/ (24*60)' --每分钟执行
interval => 'sysdate+1/(24*60)' --每分钟执行
interval => 'sysdate+1' --每天
interval => 'sysdate+1/24' --每小时
interval => 'sysdate+2/24*60' --每2分钟
interval => 'sysdate+30/24*60*60' --每30秒
Interval => 'TRUNC(sysdate+1)+1/24' --每天凌晨1点执行
Interval => 'TRUNC(SYSDATE+1)+(8*60+30)/(24*60)' --每天早上8点30分执行
Interval => 'TRUNC(next_day(sysdate,'星期一'))+1/24' --每周一凌晨1点执行
Interval => 'TRUNC(next_day(sysdate,1))+2/24' --每周一凌晨2点执行
Interval => 'TTRUNC(LAST_DAY(SYSDATE)+1)' --每月1日凌晨0点执行
Interval => 'TRUNC(LAST_DAY(SYSDATE))+1+1/24' --每月1日凌晨1点执行
Interval => 'TRUNC(ADD_MONTHS(SYSDATE,3),'q')' --每季度的第一天凌晨0点执行
Interval => 'TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24' --每季度的第一天凌晨1点执行
Interval => 'TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24' --每季度的最后一天的晚上11点执行
Interval => 'ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24' --每年7月1日和1月1日凌晨1点
Interval => 'ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24' --每年1月1日凌晨1点执行
4、SELECT * FROM JOB_TEST; --查看目标表的跑数结果
5、查看所有的JOB配置 SELECT* FROM ALL_JOBS;
5、查看job执行是否成功
select t.*
from all_scheduler_job_run_details t
where t.job_name in ('JOB_TEST') --job名字
order by log_date desc;