2016-12-28 5 views
0

oracleで実行ジョブのスケジュールを作成する必要があります。月の最初の就業日に実行されますが、休日は除きます。月の最初の就業日が休日の場合は、翌営業日以降の翌営業日でなければなりません。休日のない月の最初の日にオラクルスケジュール

私は、各月の最初の平日で管理し、休日を除外したが、私は休日後の勤務時間の実行を設定する方法がわからない...

HOLIDAYS

DBMS_SCHEDULER.CREATE_SCHEDULE (
    schedule_name => 'SCHDL_COM_HOLIDAYS', 
    repeat_interval => 'FREQ=YEARLY; BYDATE=0101,0111;' 
); 

FIRST WORKDAY

DBMS_SCHEDULER.CREATE_SCHEDULE (
    schedule_name => 'SCHDL_FIRST_WD', 
    repeat_interval => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; EXCLUDE=SCHDL_COM_HOLIDAYS; BYSETPOS=1' 
); 

答えて

0

次の手順に従ってください。

1)すべてのスケジュールを作成する休日。

BEGIN 
    DBMS_SCHEDULER.create_schedule (
     schedule_name  => 'NYD_FRI', 
     repeat_interval => 'FREQ=YEARLY;BYDATE=1231;BYDAY=FRI', 
     comments   => 'Friday alternative for New Year''s Day'); 
    DBMS_SCHEDULER.create_schedule (
     schedule_name  => 'NYD_MON', 
     repeat_interval => 'FREQ=YEARLY;BYDATE=0102;BYDAY=MON', 
     comments   => 'Monday alternative for New Year''s Day'); 
    DBMS_SCHEDULER.create_schedule (
     schedule_name  => 'NewYearsDay', 
     repeat_interval => 'FREQ=YEARLY;BYDATE=0101;BYDAY=MON,TUE,WED,THU,FRI;' 
          || 'INCLUDE=NYD_FRI,NYD_MON', 
     comments   => 'New Year''s Day'); 
); 
END; 
/

2)上記で作成したすべてのスケジュールをまとめたスケジュールを作成します。

BEGIN 
    DBMS_SCHEDULER.create_schedule (
     schedule_name  => 'FederalHolidays', 
     repeat_interval => 'NewYearsDay,MartinLutherKing,PresidentsDay,', 
     comments   => 'Federal Holidays'); 
END; 

3)ご協力いただきありがとうござい「EXCLUDE」および「BYSETPOS」オプション

BEGIN 
    DBMS_SCHEDULER.create_job (
     job_name   => 'Run_Next_Day', 
     job_type   => 'PLSQL_BLOCK', 
     job_action  => 'begin Run_Next_Day; end; ', 
     repeat_interval => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; byhour=14;byminute=30;bysecond=0; EXCLUDE=FederalHolidays; BYSETPOS=7', 
     enabled   => TRUE, 
     comments   => 'Skipping Holidays'); 
END; 
/
+0

お返事ありがとうございます。なぜあなたはそれのために雇用を創造するのか説明できますか? – Gadziu

+0

私はちょうど完全な解決策を与えました。すでに仕事がある場合は、その中に 'exclude'句を含めることができます。 – XING

1

@XING注意し、ジョブを作成します。あなたのソリューションを自分のニーズに正確に変更しました。

まさに私の問題の答えは

元旦です

BEGIN 
DBMS_SCHEDULER.create_schedule (
    schedule_name  => 'SCHD_NYD_MON', 
    repeat_interval => 'FREQ=YEARLY;BYDATE=0101;BYDAY=MON', 
    comments   => 'Monday alternative for New Year''s Day'); 
DBMS_SCHEDULER.create_schedule (
    schedule_name  => 'SCHD_NEW_YEAR_DAY', 
    repeat_interval => 'FREQ=YEARLY;BYDATE=0101;BYDAY=MON,TUE,WED,THU,FRI;' 
         || 'INCLUDE=SCHD_NYD_MON', 
    comments   => 'New Year''s Day'); 
END; 
/

まず11月の日

BEGIN 
DBMS_SCHEDULER.create_schedule (
    schedule_name  => 'SCHD_FNOV_MON', 
    repeat_interval => 'FREQ=YEARLY;BYDATE=1101;BYDAY=MON', 
    comments   => 'Monday alternative for First November'); 
DBMS_SCHEDULER.create_schedule (
    schedule_name  => 'SCHD_FIRST_NOVEMBER', 
    repeat_interval => 'FREQ=YEARLY;BYDATE=1101;BYDAY=MON,TUE,WED,THU,FRI;' 
         || 'INCLUDE=SCHD_FNOV_MON', 
    comments   => 'First November''s Day'); 
END; 
/

連邦休日

BEGIN 
    DBMS_SCHEDULER.create_schedule (
     schedule_name  => 'SCHD_HOLIDAYS', 
     repeat_interval => 'SCHD_NEW_YEAR_DAY,SCHD_FIRST_NOVEMBER', 
     comments   => 'Federal Holidays'); 
END; 
/

仕事

BEGIN 
    DBMS_SCHEDULER.create_job (
    job_name   => 'Run_Next_Day', 
    job_type   => 'PLSQL_BLOCK', 
    job_action  => 'begin Run_Next_Day; end; ', 
    repeat_interval => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; 
          byhour=12;byminute=0;bysecond=0; 
          EXCLUDE=SCHD_HOLIDAYS; BYSETPOS=1', 
    enabled   => TRUE, 
    comments   => 'Skipping Holidays'); 
END; 
/
関連する問題