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