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