oracle定時任務排程(dbms_scheduler案例)
阿新 • • 發佈:2019-04-07
資料庫層任務排程中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,