定时工作查问

查问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 isbegin  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字段查看是否失效。