Oracle Job定时任务的用法

it2025-08-15  13

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

最新回复(0)