在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,則作業必須在指定的數據庫實例中運行。