2013-10-30 88 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