oracle dbms_scheduler repeat_interval

ajm*_*d04 4 oracle jobs plsql scheduler oracle11g

我在打包的MY_PACKAGE_X中有一个名为MY_PROCEDURE_X的过程.我的要求是程序需要在每个月的1号和16号执行.如果它在本月的第1天运行,则执行时间应为10:00 AM,如果它在本月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;
/
Run Code Online (Sandbox Code Playgroud)

在此先感谢;)

Kim*_*sen 10

编辑:我以前的答案实际上没有奏效.出于某种原因,BYHOUR无法在指定的时间表中使用 - 它给出了错误.

相反,我发现了一种在单个repeat_interval表达式中执行此操作的方法:

'FREQ=MONTHLY;BYMONTHDAY=1,16;BYHOUR=10,17;BYSETPOS=1,4'
Run Code Online (Sandbox Code Playgroud)

这里的技巧是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;
/
Run Code Online (Sandbox Code Playgroud)

该块输出以下结果:

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
Run Code Online (Sandbox Code Playgroud)