Oracle調度Schedule特性(第一部分)-job
在主機層面,我想要執行一些定時任務,通常會使用crontab。方便又實用,那么oracle里面是不是也有定時任務的概念呢?
Oracle Scheduler的引入就是用來管理和計劃數據庫的Job,通過它可以讓很多常規的數據庫任務自動執行,減少人為干預,
解放勞動力,本質上來說,它和Linux的crontab的功能是一樣的。但是它們的領域又不一樣,Oracle Scheduler專注于Oracle數據庫Job的自動化管理、維護和監控。
在10g之后,ORACLE建議使用Scheduler替換普通的job,來管理任務的執行。其實將Scheduler描述成管理job的工具已經太過片面了,
10G版本中新增的Scheduler絕不僅僅是創建任務這么簡單。他還有很多很多強大的功能,下面我們來通過幾個篇章來逐一進行介紹
所謂JOBS,其實就是Scheduler管理的一個(或多個)任務的執行調度,也就是具體干活的那個人。
1、怎么創建一個job呢?
通過DBMS_SCHEDULER包來創建job,使用包里的CREATE_JOB過程來創建job,用戶可以指定要執行的任務,調度信息(啥時候執行,執行周期,終止日期等)以及其它一些任務相關的屬性。
begin
dbms_scheduler.create_job(
job_name => 'INSERT_TEST_TBL',
job_type => 'STORED_PROCEDURE',
job_action => 'P_INSERT_INTOTEST',
start_date => sysdate,
repeat_interval => 'FREQ=DAILY;INTERVAL=1');
END;
/
2、job的創建說明:
使用CREATE_JOB過程來創建job的時候,可指定的參數值有很多,大部分時間,我們只需要掌握的并沒有那么多。下面對幾個重點的參數進行一下介紹:
job_name指定job的名稱,這個值需要是唯一的。
job_type任務執行的操作類型,這里也是需要必須指定的,可選值為:
PLSQL_BLOCK 表示任務執行的是一個PL/SQL匿名塊。
STORED_PROCEDURE 表示任務執行的是ORACLE存儲過程(含PL/SQL PROCEDURE和JAVA PROCEDURE)。
EXECUTABLE 表示任務執行的是一個外部程序,比如說操作系統命令。
CHAIN 表示任務執行的是一個CHAIN。
job_action任務執行的操作,應與JOB_TYPE類型中指定的參數相匹配。比如說對于PL/SQL匿名塊,此處就可以放置PL/SQL塊的具體代表,
類似DECLARE .. BEGIN ..END這類;如果是ORACLE過程,那么此處應該指定具體的過程名,注意由于任務執行,即使過程中有OUT之類參數,實際執行時也不會有輸出的。
start_date指定任務初次執行的時間,本參數可為空,當為空時,表示任務立刻執行,效果等同于指定該參數值為SYSDATE。
repeat_interval指定任務執行的頻率,比如多長時間會被觸發再次執行。本參數也可以為空,如果為空的話,就表示當前設定的任務只執行一次。
REPEAT_INTERVAL參數與標準JOB中的INTERVAL參數有很大區別,相比之下,REPEAT_INTERVAL參數的語法結構要復雜的多。其中最重要的是FREQ和INTERVAL兩個關鍵字。
FREQ 關鍵字用來指定間隔的時間周期,可選參數有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,分別表示年、月、周、日、時、分、秒等單位。
INTERVAL 關鍵字用來指定間隔的頻繁,可指定的值的范圍從1-99。
REPEAT_INTERVAL=>'FREQ=DAILY;INTERVAL=1';表示每天執行一次,如果將INTERVAL改為7就表示每7天執行一次,效果等同于FREQ=WEEKLY;INTERVAL=1。
通常來講,使用DBMS_SCHEDULER.CREATE_JOB創建一個JOB,上述參數基本是需要指定的。除此之外,還可以在CREATE_JOB時,指定下列參數:
NUMBER_OF_ARGUMENTS 指定該JOB執行時需要附帶的參數的數量,默認值為0,當JOB_TYPE列值為PLSQL_BLOCK或CHAIN時,本參數必須設置為0,因為上述兩種情況下不支持附帶參數。
END_DATE 指定任務的過期時間,默認值為NULL。任務過期后,任務的STATE將自動被修改為COMPLETED,ENABLED被置為FALSE。如果該參數設置為空的話,
表示該任務永不過期,將一直按照REPEAT_INTERVAL參數設置的周期重復執行,直到達到設置的MAX_RUNS或MAX_FAILURES值。
JOB_CLASS 指定任務關聯的CLASS,默認值為DEFAULT_JOB_CLASS。
ENABLED 指定任務是否啟用,默認值為FALSE。FALSE狀態表示該任務并不會被執行,除非被用戶手動調用,或者用戶將該任務的狀態修改為TRUE。
AUTO_DROP 當該標志被置為TRUE時,ORACLE會在滿足條件時自動刪除創建的任務
任務已過期的條件;
任務最大運行次數已達MAX_RUNS的設置值;任務未指定REPEAT_INTERVAL參數,僅運行一次。
該參數的默認值即為TRUE。用戶在執行CREATE_JOB過程時可以手動將該標志指定為FALSE,當參數值設置為FALSE時,即使滿足上述提到的條件任務也不會被自動刪除,這種情況下,唯一能夠導致任務被刪除的情況,就是用戶主動調用DROP_JOB過程。
COMMENTS 設置任務的注釋信息,默認值為NULL。
上面的例子創建了一個新的JOB,不過這個JOB與普通JOB不同,此時查詢USER_JOBS視圖是查不到剛剛創建的JOB的信息,
因為這個JOB是SCHEDULER管理的JOB。要查詢SCHEDULER管理的JOS,應該通過USER_SCHEDULER_JOBS(當然ALL_SCHEDULER_JOBS和DBA_SCHEDULER_JOBS也可以),例如:
select job_name,job_type,job_action,to_char(start_date,'yyyy-mm-dd hh34:mi:ss'),repeat_interval,enabled,state from user_scheduler_jobs;
JOB_NAME JOB_TYPE JOB_ACTION TO_CHAR(START_DATE, REPEAT_INTERVAL ENABL STATE
-------------------- ---------------- ------------------------- ------------------- ------------------------------ ----- ---------------
INSERT_TEST_TBL STORED_PROCEDURE P_INSERTINTOTEST 2009-07-27 13:46:50 FREQ=DAILY;INTERVAL=1 FALSE DISABLED
不過,細心的朋友可能會發現,JOB雖然成功創建了,但卻并未執行,這是怎么回事?其實原因很簡單,還記的前面介紹CREATE_JOB過程時提到的ENABLED參數嗎,當不顯式指定時,
該參數的默認值為false,JOB自然不會運行了。如果遇到這類情形,如何修改呢?
需要通過下面的命令:
exec dbms_scheduler.enable(¨INSERT_TEST_TBL¨);