长期跟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;