乐趣区

关于oracle:Oracle定时任务

定时工作查问

查问 oracle 定时工作,能够通过:

-- 所有用户的定时工作
SELECT * FROM dba_jobs;
-- 本用户的定时工作
select * from user_jobs;

查问后果中,what 字段个别寄存存储过程名称(或者具体的存储过程内容),BROKEN= N 示意工作执行中,BROKEN= Y 示意进行。
要依据存储过程名称,查问存储过程内容,能够通过:

select * from user_source where type = 'PROCEDURE'
and name = 'YXTESTJOB'
order by name, line;

这样,就能够梳理出定时工作到底做了些什么事件。

定时工作创立

定时工作个别用于定时的执行存储过程。所以先创立存储过程,而后再创立工作。
创立存储过程:

-- 创立存储过程
create or replace procedure YxtestJob is
begin
  insert into test1(id, name)
  values(1, to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
end;

创立定时工作:

-- 通过脚本创立定时工作
declare job_no number;
begin
  sys.dbms_job.submit(job => job_no,
                      what => 'YxtestJob;',
                      next_date => to_date('19-08-2020 15:53:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'TRUNC(sysdate,''mi'') + 1/(24*60)');
  commit;
end;

这里,job_no 会由数据库主动调配,并且会避开已被应用过的数字,避免反复。

留神:what 对应的值,必须有分号结尾。并且对应的存储过程必须是失常状态的
没有分号结尾的报错:

interval 距离的设置阐明

  • 每分钟执行:TRUNC(sysdate,'mi') + 1/(24*60)

TRUNC(sysdate,’mi’)示意日期截取到分钟,1/(2460)示意: 1 天 /(2460)=24 小时 /(24*60)=1/60 小时 = 1 分钟

  • 每小时执行:TRUNC(sysdate,'hh') + 1/24

TRUNC(sysdate,’hh’)示意日期截取到小时,1/24 示意: 1 天 /24=24 小时 /24= 1 小时

  • 每天凌晨 1 点执行:TRUNC(sysdate + 1) + 1/(24)

TRUNC(sysdate+ 1)示意第二天,1/(24)示意 1 小时,整个的意思示意:第二天的 1 点。

  • 每周一凌晨 1 点执行:TRUNC(next_day(sysdate, A)) + 1/24,这里 A 能够是 1~7 或者 Monday/Mon~Sunday/ 或者星期一~ 星期日。NLS_DATE_LANGUAGE 为简体中文时,能够用星期一这种写法。

TRUNC(next_day(sysdate, 2))示意下星期一,+1/24 示意加 1 小时,即星期一凌晨 1 点。

  • 每月 1 日凌晨 1 点执行:TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24

LAST_DAY(SYSDATE)示意以后月份的最初一天,TRUNC(LAST_DAY(SYSDATE))+ 1 示意下个月 1 日,+1/24 示意凌晨 1 点。

  • 每季度的第一天凌晨 1 点执行:TRUNC(ADD_MONTHS(SYSDATE, 3),'Q') + 1/24

ADD_MONTHS(SYSDATE,3)示意下个季度的某个月份,TRUNC(SYSDATE,’Q’)示意本季度第一个月 1 日,TRUNC(ADD_MONTHS(SYSDATE,3),’Q’)示意下个季度的第一个月份 1 日。

  • 每年定时执行:ADD_MONTHS(trunc(sysdate,'yyyy'), 12) + 1/24

trunc(sysdate,’yyyy’)示意当年第一天,ADD_MONTHS(trunc(sysdate,’yyyy’), 12)示意第二年第一天。这里为何不间接:trunc(sysdate,’yyyy’) + 1/24,可能是因为创立此定时工作时,曾经不是当年的第一天,如果间接设置成当年第一天,则工夫已过,定时工作不会退出调度。

  • 每半年定时执行:ADD_MONTHS(trunc(sysdate,'yyyy'), 6) + 1/24

每年 7 月 1 日和 1 月 1 日凌晨 1 点。这条未了解,待确认。

查问 NLS_DATE_LANGUAGE 参数值,能够通过:select * from nls_database_parameters

也能够通过 pl/sql 工具来创立:

右键 Jobs =》新建 =》填入对应的值 =》点击利用 =》实现
这里截图的是编辑的窗口,下一日期 4000/1/ 1 示意该工作进行了。

启动和进行 job

工作创立好后是主动启动的,如果中途手动进行了,那么能够通过脚本启动。
启动 job: dbms_job.run(jobno); — 指定工作号 (dba_jobs.job 字段) 启动
进行 job: dbms.broken(jobno, broken, nextdate); -– broken 为 boolean 值
这两条语句不能独自执行,须要通过存储过程,如:

-- 进行 6 号工作
begin
 dbms_job.broken(6, true, sysdate);
 commit;
end;
-- 启动 6 号工作
begin
 dbms_job.run(6);
 commit;
end;

进行或者启动后,能够通过 dba_jobs.broken 字段查看是否失效。

退出移动版