1. 程式人生 > >oracle定時任務排程(dbms_scheduler案例)

oracle定時任務排程(dbms_scheduler案例)

開發十年,就只剩下這套架構體系了! >>>   

資料庫層任務排程中mysql有event,postgreSQL有pgAgent(外掛實現),那麼oracle有dbms_job/dbms_scheduler。

oracle10g以後推薦使用dbms_scheduler,據說比dbms_job更加健壯,日誌或者是減少作業系統依賴更強等等,具體可以去看看相關資料,所以以它為例:

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就表示每天下午的4、5、6點。
BYDAY 關鍵字用來指定每週的哪天執行。
BYMONTHDAY 關鍵字用來指定每月中的哪一天。-1 表示每月最後一天。
BYMONTH  關鍵字用來指定每年的月份。
BYDATE 指定日期。0310就表示3月10日。

REPEAT_INTERVAL例子:

執行每星期五。(所有這三個例子是等價的。)
    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'; 

設定任務在每天的下午4、5、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,