2013-10-30 59 views
2

我想创建一个每年在2am on the first Sunday in October上运行的作业,我试着用下面的代码。但得到的错误一样,创建计划程序作业在一年内运行一次

Error report: 
ORA-27419: unable to determine valid execution date from repeat interval 
ORA-06512: at "SYS.DBMS_ISCHED", line 124 
ORA-06512: at "SYS.DBMS_SCHEDULER", line 271 
ORA-06512: at line 2 

下面的代码为创造就业提前

BEGIN 
DBMS_SCHEDULER.CREATE_JOB(job_name  => 'To_DST_Australia', 
          job_type  => 'PLSQL_BLOCK', 
          JOB_ACTION  => 'BEGIN 
               NULL; 
               END;', 
          start_date  => SYSTIMESTAMP, 
          repeat_interval => 'FREQ=YEARLY; BYMONTH=OCT; BYDAY=1SUN; BYHOUR=2; BYMINUTE=00; BYSECOND=00', 
          end_date  => NULL, 
          enabled   => TRUE, 
          comments  => '1st Sunday in October'); 
END; 
/

感谢。

+0

更改'FREQ = MONTHLY'代替'YEARLY'执行精细。仍然不确定在“年”情况下失败的原因。如果我们使用'YEARLY'指定'BYDAY = SUN',那么运行良好。 – learningloop

+0

关于BYDAY的Oracle文档:*“使用数字,如果使用月份频率或月份的第四个THU,则可以使用MONTHLY频率指定一年中的第26个星期五。”* http://docs.oracle。 com/cd/E16655_01/appdev.121/e17602/d_sched.htm#ARPLS72263 –

+1

年的第一个周日不会在十月发生,所以YEARLY表达式与任何日期都不匹配(因为您规定它应该尝试找到一年中的第一个星期天,但它必须在十月)。 –

回答

2

使用每月频率:

DECLARE 
start_date  TIMESTAMP; 
return_date_after TIMESTAMP; 
next_run_date  TIMESTAMP; 
BEGIN 
    start_date := TO_TIMESTAMP_TZ('01-JAN-2013 00:00:00','DD-MON-YYYY HH24:MI:SS'); 

    return_date_after := start_date; 
    FOR i IN 1..5 
    LOOP 
    dbms_scheduler.evaluate_calendar_string(
    'FREQ=MONTHLY; BYMONTH=OCT; BYDAY=1SUN; BYHOUR=2', 
    start_date, return_date_after, next_run_date); 

    dbms_output.put_line('next_run_date: ' || next_run_date); 
    return_date_after := next_run_date; 
    END LOOP; 
END; 
/

next_run_date: 06/OCT/13 02:00:00.000000 AM 
next_run_date: 05/OCT/14 02:00:00.000000 AM 
next_run_date: 04/OCT/15 02:00:00.000000 AM 
next_run_date: 02/OCT/16 02:00:00.000000 AM 
next_run_date: 01/OCT/17 02:00:00.000000 AM 
+0

太好了。非常感谢..!! :) – Dba