Oracle PL/SQL進階編程(第九彈:使用系統包:DBMS_JOB)

在Oracle開發中,經常需要對一些任務進行調度。在Oracle中,調度任務又稱爲作業,只要是使用DBMS_JOB包來實現的。

創建作業SUBMIT

這個過程用來創建一個作業,並且輸出作業號碼。當建立新的作業時,需要給出作業要執行的操作,作業在下一次運行的日期及運行的時間間隔,語法如下:

PROCEDURE SUBMIT(job       OUT BINARY_INTEGER,          -- 由過程自動生成的作業號,返回給調用方
                 What      IN VARCHAR2,                 -- 要執行的作業,通常是一個過程名
                 next_date IN DATE DEFAULT SYSDATE,     -- 下一次執行的日期
                 interval  IN VARCHAR2 DEFAULT NULL,    -- 執行週期的時間間隔
                 no_parse  IN BOOLEAN DEFAULT False,    -- 是否解析與作業相關的例程
                 instance  IN BINARY_INTEGER DEFAULT 0, -- 指定哪個例程可以運行作業
                 force     IN BOOLEAN DEFAULT False     -- 是否強制運行與作業相關的例程
                 );

舉個例子,DBMS_DDL.ANALYZE_OBJECT可以分析數據表,並且將存儲結果存儲起來,對於SQL的運行效率有較大的提升,大多數DBA經常需要用到這個過程來進行性能優化,因此會將其定義爲一個作業來每日運行一次,實現代碼如下:

DECLARE
   v_jobno   NUMBER;
BEGIN
   DBMS_JOB.submit
        (v_jobno,                             --作業編號
          --作業執行的過程
         'DBMS_DDL.analyze_object(''TABLE'',''SCOTT'',''EMP'',''COMPUTE'');',
         --下一次執行的日期         
         SYSDATE,
         --執行的時間間隔,表示24小時。
         'SYSDATE+1'
        );  
   DBMS_OUTPUT.put_line('獲取的作業編號爲:'||v_jobno);  --輸出作業編號
   COMMIT;
END;

在創建了作業後,可以通過user_jobs數據字典來查詢創建的作業。

這裏要說一下,interval參數是VARCHAR2類型,不是一個日期或天或分鐘的數字,例如:
‘SYSDATE+1’:表示每天的當前時間運行
‘TRUNC(SYSDATE)+1’:表示每天的0點運行
‘TRUNC(SYSDATE)+17/24’:表示在每天下午5點運行
‘null’:表示作業立即運行,運行完退出,不重複運行

移除作業REMOVE

該過程用於移除在隊列中的某個作業,當前運行的作業不受影響,即使刪除的作業不再執行,依然會執行完畢,只是後續不會再次執行。用戶只能刪除屬於自己的作業。
DBMS_JOB.REMOVE(job IN BINARY_INTEGER);
比如想刪除作業22904,代碼這樣寫:
EXECUTE DBMS_JOB.REMOVE(22904);

更改作業 CHANGE

CHANGEG用來改變已提交作業的一些設置的參數,語法如下:

DBMS_JOB.CHANGE(job       OUT BINARY_INTEGER,
                What      IN VARCHAR2,
                next_date IN DATE DEFAULT SYSDATE,
                interval  IN VARCHAR2 DEFAULT NULL,
                instance  IN BINARY_INTEGER DEFAULT 0,
                force     IN BOOLEAN DEFAULT False
                );

參數的含義與SUBMIT基本相同,如果參數what,next_date,interval爲NULL,則保持以前的值不變。用戶只能修改自己的作業。
比如想要把作業22904改爲每兩天執行一次,則:
DBMS_JOB.CHANGE(22904, NULL, NULL, 'SYSDATE + 2');

更改作業執行WHAT

用於改變指定作業執行的PL/SQL代碼。
DBMS_JOB.WHAT(job IN BINARY_INTEGER, what IN VARCHAR2);

更改運行日期NEXT_DATE

DBMS_JOB.NEXT_DATE(job IN BINARY_INTEGER, next_date IN DATE);

數據庫實例配置INSTANCE

該過程用於更改執行的數據庫實例的配置。

DBMS_JOB.INSTANCE(job      IN BINARY_INTEGER,
                  instance IN BINARY_INTEGER,
                  force    IN BOOLEAN DEFAULT False);

instance爲指定提交作業 到指定的數據庫的實例。

更改間隔INTERVAL

DBMS_JOB.INTERVAL(job IN BINARY_INTEGER, interval IN VARCHAR2);

中斷做業BROKEN

用於標記作業中斷或非中斷,中斷作業將不再被執行,Oracle不會試圖去執行一個標記爲中斷的作業,但是用戶可以通過調用DBMS_JOB.RUN過程強制執行一個標記爲中斷的作業。

DBMS_JOB.BROKEN(job       IN BINARY_INTEGER,
                broken    IN BOOLEAN,
                next_date IN DATE DEFAULT SYSDATE);

比如要將作業22904標記爲中斷,並執行下一次的執行時間爲下個星期一:
DBMS_JOB.BROKEN(22904, False, NEXT_DATE(SYSDATE, 'MONDAY'));

強製作業運行RUN

使用RUN可以強製作業立即執行,即使作業已標記爲中斷。因爲作業在運行完後會計算下一次執行的時間,因此在調用RUN之後,下一次的執行時間也會發生改變。語法 如下:
DBMS_JOB.RUN(job IN BINARY_INTEGER, force IN BOOLEAN DEFAULT False);
force參數爲True時,作業 執行優化配置無效,如果爲False,則作業必須在指定的數據庫實例中運行。

發佈了165 篇原創文章 · 獲贊 47 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章