(2)使用Jobs之管理jobs |
[君三思] 2009-7-31 |
1.2 管理Jobs1.2.1 啟用Jobs前面創(chuàng)建JOB時,由于未顯式的指定ENABLED參數(shù),因此即使指定了START_DATE,不過默認(rèn)情況下JOB不會自動執(zhí)行。對于這種情況,DBMS_SCHEDULER包中提供了一個過程ENABLE,可以用來修改JOB的啟用狀態(tài),調(diào)用方式非常簡單,例如: SQL> exec dbms_scheduler.enable(¨INSERT_TEST_TBL¨); PL/SQL procedure successfully completed.1.2.2 禁用JobsDBMS_SCHEDULER.ENABLE 僅用來將JOB(其實(shí)不僅僅對JOB有效,對于CHAIN、PROGRAM等也有效)的啟用狀態(tài)置為TRUE。如果想將其啟用狀態(tài)置為FALSE?簡單,還有一個與該功能對應(yīng)的過程:DBMS_SCHEDULER.DISABLE,例如: SQL> exec dbms_scheduler.disable(¨INSERT_TEST_TBL¨); PL/SQL procedure successfully completed.這兩個過程僅用來重置對象的狀態(tài),因此均可以無限次執(zhí)行,即使執(zhí)行時對象已經(jīng)被置為要指定的狀態(tài)。 1.2.3 修改Jobs由于JOB的屬性眾多,難免時不時的可能會遇到需要修改的情況,比如說前面創(chuàng)建JOB時不小心,指定要執(zhí)行的過程名輸入錯誤(完全有可能,CREATE_JOB在創(chuàng)建時不會自動檢查指定的過程是否有效,從這方面考慮,SCHEDULER不如普通JOB嚴(yán)謹(jǐn)哪),這種情況下就必然涉及到對JOB的修改(或者說重定義),沒問題,DBMS_SCHEDULER包中專門提供了一個過程SET_ATTRIBUTE,可以用來修改任務(wù)的屬性值。 例如,修改剛剛創(chuàng)建的JOB:INSERT_TEST_TBL執(zhí)行的過程,執(zhí)行語句如下: SQL> exec dbms_scheduler.set_attribute(¨INSERT_TEST_TBL¨,¨JOB_ACTION¨,¨P_ INSERT INTOTEST¨); PL/SQL procedure successfully completed當(dāng)然啦,我們這里執(zhí)行的這條語句,執(zhí)行跟沒執(zhí)行沒有區(qū)別,此處僅做示例,大家表深究。 SET_ATTRIBUTE 過程雖然僅有三個參數(shù),不過能夠修改的屬性值可是不少,以下列舉幾個較常用到的:
本參數(shù)又與AUTO_DROP相關(guān)聯(lián),如果AUTO_DROP設(shè)置為TRUE的話,那么一旦job到達(dá)停止運(yùn)行的時間,該job就會被自動刪除,否則的話job任何存在,不過狀態(tài)被修改為COMPLETED。 除此之外,其它還包括MAX_RUN_DURATION,JOB_WEIGHT,INSTANCE_STICKINESS,STOP_ON_WINDOW_CLOSE,JOB_PRIORITY,SCHEDULE_LIMIT,PROGRAM_NAME,NUMBER_OF_ARGUMENTS,SCHEDULE_NAME,REPEAT_INTERVAL,JOB_CLASS,COMMENTS,AUTO_DROP,EVENT_SPEC,RAISE_EVENTS等等,這些參數(shù)所代表的意義此處不一一詳述,感興趣的朋友可以查閱相關(guān)官方文檔,或者等待本系列文章的外傳,黑黑。 僅從這些可設(shè)置屬性就可以看出,Scheduler管理的job確實(shí)非常靈活,上述提到了這些參數(shù),均可以使用DBMS_SCHEDULER.SET_ATTRIBUTE過程進(jìn)行設(shè)置。 另外需要注意一點(diǎn),除了用戶手動創(chuàng)建的jobs之外,數(shù)據(jù)庫在運(yùn)行過程中也有可能自動創(chuàng)建jobs。對于這類jobs除非必要,否則不建議進(jìn)行修改。至于如何區(qū)分jobs是用戶創(chuàng)建,還是數(shù)據(jù)庫自動創(chuàng)建,可以通過*_SCHEDULER_JOBS視圖的SYSTEM列來確定,如果該列顯示為TRUE,則表示由系統(tǒng)創(chuàng)建 1.2.4 執(zhí)行Jobs雖然說jobs大多都應(yīng)該是自動執(zhí)行,不過經(jīng)過前面的示例,大家想必也認(rèn)識到了,并不是說創(chuàng)建了jobs它就會自動執(zhí)行,是否能夠真正自動執(zhí)行并不是由你的主觀意愿就能直接決定,而是由jobs自身的多個相關(guān)屬性決定。 關(guān)于jobs自動執(zhí)行的話題相信看完前面的內(nèi)容后,應(yīng)該都知道如何設(shè)置,下面主要演示,如何手動調(diào)用jobs并執(zhí)行,這其中,當(dāng)然少不了DBMS_SCHEDULER包。例如,手動執(zhí)行前面剛剛創(chuàng)建的job:INSERT_TEST_TBL: SQL> exec dbms_scheduler.run_job(¨INSERT_TEST_TBL¨); PL/SQL procedure successfully completedJobs 每執(zhí)行一次,無論成功或失敗,均會在*_SCHEDULER_JOB_LOG中生成一條對應(yīng)的記錄(前提是LOGGING_LEVEL屬性值未設(shè)置為DBMS_SCHEDULER.LOGGING_OFF),同時,用戶也可以通過*_SCHEDULER_JOB_RUN_DETAILS視圖查詢job執(zhí)行的詳細(xì)信息。 1.2.5 停止Jobs停止job可以使用DMBS_SCHEDULER.STOP_JOB過程,例如: SQL> exec dbms_scheduler.stop_job(¨INSERT_TEST_TBL¨); PL/SQL procedure successfully completed注意,STOP_JOB過程不僅僅是更新job的狀態(tài),而是停止當(dāng)前正在執(zhí)行的任務(wù),如果你處理的任務(wù)當(dāng)前未在運(yùn)行的話,那么執(zhí)行STOP_JOB過程,會觸發(fā)ORA-27366錯誤。 停止Jobs也會觸發(fā)一條任務(wù)的日志信息,對于執(zhí)行停止操作的job,其*_SCHEDULER_JOB_LOG視圖的OPERATION會記錄為¨STOPPED¨,ADDITIONAL_INFO列中記錄的信息類似¨REASON="Stop job called by user: username"¨。 1.2.6 刪除Jobs刪除創(chuàng)建的job就比較簡單了,直接執(zhí)行DBMS_SCHEDULER.DROP_JOB過程即可,例如: SQL> exec dbms_scheduler.drop_job(¨INSERT_TEST_TBL¨); PL/SQL procedure successfully completed刪除jobs并不是修改該job中某個字段的標(biāo)記值,而是直接刪除其在數(shù)據(jù)字典中的字義,因此被刪除的job如果未來發(fā)現(xiàn)仍然需要,只能重建,而無法通過其它方式快速恢復(fù)。不過,刪除jobs的操作,并不會級聯(lián)刪除這些job曾經(jīng)執(zhí)行過的日志信息。 |