oracle定時任務調度(dbms_scheduler案例)

數據庫層任務調度中mysql有event,postgreSQL有pgAgent(插件實現),那麼oracle有dbms_job/dbms_scheduler。mysql

oracle10g之後推薦使用dbms_scheduler,聽說比dbms_job更加健壯,日誌或者是減小操做系統依賴更強等等,具體能夠去看看相關資料,因此以它爲例:sql

BEGIN
  FOR V_JOB IN (SELECT JOB_NAME
                  FROM USER_SCHEDULER_JOBS K
                 WHERE K.JOB_NAME IN ('TEST_JOB')
                 ) LOOP
    DBMS_SCHEDULER.DROP_JOB(V_JOB.JOB_NAME);
  END LOOP;
  FOR V_PROG IN (SELECT PROGRAM_NAME
                  FROM USER_SCHEDULER_PROGRAMS S
                 WHERE S.PROGRAM_NAME IN ('TEST_PROGRAM')
                  ) LOOP
	DBMS_SCHEDULER.DROP_PROGRAM(V_PROG.PROGRAM_NAME);
  END LOOP;

   --定義PROGRAM
  DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME        => 'TEST_PROGRAM',
                                PROGRAM_TYPE        => 'STORED_PROCEDURE',
                                PROGRAM_ACTION      => '要調用的存儲過程',
                                NUMBER_OF_ARGUMENTS => 0,
                                ENABLED             => FALSE,
                                COMMENTS            => NULL);

  --定義參數(根據調用的存儲過程而定)
  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'TEST_PROGRAM',
                                              ARGUMENT_NAME     => 'in_param',
                                              ARGUMENT_POSITION => 1,
                                              ARGUMENT_TYPE     => 'NUMBER',
                                              DEFAULT_VALUE     => -1);

  -- 啓用PROGRAM
  DBMS_SCHEDULER.ENABLE(NAME => 'TEST_PROGRAM');

  --定義JOB
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME         => 'TEST_JOB',
                            PROGRAM_NAME     => 'TEST_PROGRAM',
                            COMMENTS         => '如天天凌晨2點執行',
                            REPEAT_INTERVAL  => 'FREQ=DAILY; BYHOUR=02; BYMINUTE=00;',
                            AUTO_DROP        => FALSE,
                            ENABLED          => FALSE);
  --啓用JOB
  DBMS_SCHEDULER.ENABLE(NAME => 'TEST_JOB');
END;
/

REPEAT_INTERVAL可選參數:數據庫

YEARLY(年), MONTHLY(月), WEEKLY(周), DAILY(日), HOURLY(時), MINUTELY(分), SECONDLY(秒)等單位。
INTERVAL 關鍵字用來指定間隔的頻繁,可指定的值的範圍從1-999。
BYHOUR  指定一天中的小時。可指定的值的範圍從1-24。16,17,18就表示天天下午的四、五、6點。
BYDAY 關鍵字用來指定每週的哪天運行。
BYMONTHDAY 關鍵字用來指定每個月中的哪一天。-1 表示每個月最後一天。
BYMONTH  關鍵字用來指定每一年的月份。
BYDATE 指定日期。0310就表示3月10日。

REPEAT_INTERVAL例子:oracle

運行每星期五。(全部這三個例子是等價的。)
    FREQ=DAILY; BYDAY=FRI;  
    FREQ=WEEKLY; BYDAY=FRI;  
    FREQ=YEARLY; BYDAY=FRI;  

設置任務隔一週運行一次,而且僅在周5運行:
    FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;  

在每個月的最後一天運行
    FREQ=MONTHLY; BYMONTHDAY=-1;  

三月十日開。(兩個例子是等價的)
    FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;  
    FREQ=YEARLY; BYDATE=0310;  

設置任務每10隔天運行:
    REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10'; 

設置任務在天天的下午四、五、6點時運行:
    REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18';  

設置任務在每個月29日運行:
    REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29';  

設置任務在每一年的最後一個周5運行:
    REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI';  

設置任務每隔50個小時運行:
    REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50';  

每隔2小時運行一次job
    repeat_interval => 'FREQ=HOURLY; INTERVAL=2'

天天運行一次job
    repeat_interval => 'FREQ=DAILY'

每週的1,3,5運行job
    repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"

每一年的3,6,9,12月的30號運行job
    repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'
相關文章
相關標籤/搜索