我在打包的MY_PACKAGE_X中有一个名为MY_PROCEDURE_X的程序。 我的要求是程序需要在每个月的1号和16号执行。 如果它在本月的第一天运行,则执行时间应为上午10:00, 如果它在本月16日运行,那么执行时间应该是05:00 PM。
我可以做一份工作吗? 下面是我完成的一半脚本:
BEGIN
dbms_scheduler.create_job (
job_name => 'PROCESS_MY_JOB_X',
JOB_TYPE => 'PLSQL_BLOCK',
JOB_ACTION => 'MY_PACKAGE_X.MY_PROCEDURE_X',
START_DATE => TO_DATE('01-11-2014 10:00','DD-MM-YYYY HH24:MI'),
repeat_interval => 'FREQ=DAILY; INTERVAL=14',
ENABLED => TRUE,
comments => 'RUN JOB ON 1ST AND 16TH OF EVERY MONTH');
END;
/
提前致谢;)
答案 0 :(得分:10)
相反,我发现了一种在单repeat_interval
表达式中执行此操作的方法:
'FREQ=MONTHLY;BYMONTHDAY=1,16;BYHOUR=10,17;BYSETPOS=1,4'
这里的技巧是BYMONTHDAY = 1,16和BYHOUR = 10,17实际上创建了一组四个日期/时间:
第1名10分,1号17分,16号10号,16号17号
然后BYSETPOS = 1,4选择四个中的第一个和第四个日期/时间,这就是我们想要的两个日期/时间。
人们总是可以使用repeat_interval
测试dbms_scheduler.evaluate_calendar_string
表达式,例如:
declare
startdate date;
dateafter date;
nextdate date;
begin
startdate := TO_DATE('01-11-2014 10:00','DD-MM-YYYY HH24:MI');
dateafter := startdate;
for i in 1..24 loop
dbms_scheduler.evaluate_calendar_string(
'FREQ=MONTHLY;BYMONTHDAY=1,16;BYHOUR=10,17;BYSETPOS=1,4'
, startdate
, dateafter
, nextdate
);
dbms_output.put_line(to_char(nextdate,'YYYY-MM-DD HH24:MI'));
dateafter := nextdate;
end loop;
end;
/
该块输出此结果:
2014-11-16 17:00
2014-12-01 10:00
2014-12-16 17:00
2015-01-01 10:00
2015-01-16 17:00
2015-02-01 10:00
2015-02-16 17:00
2015-03-01 10:00
2015-03-16 17:00
2015-04-01 10:00
2015-04-16 17:00
2015-05-01 10:00
2015-05-16 17:00
2015-06-01 10:00
2015-06-16 17:00
2015-07-01 10:00
2015-07-16 17:00
2015-08-01 10:00
2015-08-16 17:00
2015-09-01 10:00
2015-09-16 17:00
2015-10-01 10:00
2015-10-16 17:00
2015-11-01 10:00