數據庫層任務調度中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'