1、 SUBMIT
該過程用於建立一個新的作業,當建立作業的時候,需要通過設置相應的參數來告訴Oracle要執行的內容,要執行的時間,要執行任務的間隔。如下格式:
DBMS_JOB.SUBMIT(
JOB OUT BINARY_INTERGER,
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 ANY_INSTANCE,
FORCE IN BOOLEAN DEFAULT FALSE
);
參數說明:
編號 |
參數 |
參數說明 |
1 |
job |
用於指定作業編號 |
2 |
what |
用於指定作業要執行的操作 |
3 |
next_date |
用於指定該操作的下一次運行的日期 |
4 |
interval |
用於指定該操作的時間間隔 |
5 |
no_parse |
用於指定是否需要解析與作業相關的過程 |
6 |
instance |
用於指定哪個例程可以運行作業? |
7 |
force |
用於指定是否強制運行與作業相關的例程 |
建立Oracle作業的例子:
DECLARE
JOBNO NUMBER; --通過查看該變量可以得到返回的作業編號
BEGIN
DBMS_JOB.SUBMIT(
JOBNO,
'PRC_SENDTOGX;', --執行工信局提供數據的腳本程序
SYSDATE, --現在執行
'SYSDATE+1'
);
END;
interval參數值
描述 |
Interval參數值 (部分需要驗證一下) |
每天午夜12點 |
'TRUNC(SYSDATE + 1)' |
每天早上8點30分 |
'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' |
每星期二中午12點 |
'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' |
每個月第一天的午夜12點 |
'TRUNC(LAST_DAY(SYSDATE ) + 1)' |
每個季度最後一天的晚上11點 |
'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' |
每分鐘執行一次 |
'SYSDATE+1/1440' |
2、 REMOVE
這個過程的作用是用於刪除作業隊列當中的特定的作業,它的語法如下:
DBMS_JOB.REMOVE(JOB IN BINARY_INTEGER);
下面是一個刪除作業的例子:
首先查看DBA_JOBS表,看錶裏面有哪些任務正在執行着?
SELECT * FROM DBA_JOBS;
可以看到裏面的JOB就是我們要刪除的作業的編號,LOG_USER是創建該任務的人。
SQL> EXEC DBMS_JOB.REMOVE(467);
SQL>COMMIT;
這樣就能把已經建立的作業刪除了。
3、 CHANGE
該過程改變與作業相關的所有的信息,其中包括作業的操作內容,作業運行的時間以及運行時間間隔信息等等。語法如下:
DBMS_JOB.CHANGE(
JOB IN BINARY_INTEGER,
WHAT IN VARCHAR2,
NEXT_DATE,
INTERVAL IN VARCHAR2,
INSTANCE IN BINARY_INTEGER DEFAULT NULL,
FORCE IN BOOLEAN DEFAULT FALSE
);
例子:
SQL>EXEC DBMS_JOB.CHANGE(2,NULL,NULL,’SYSDATE+2’);
SQL>COMMIT;
4、 WHAT
WHAT用來改變作業要執行的操作,例如:
SQL>EXEC DBMS_JOB.WHAT(268,’GETGX_AC01;’);
5、 NEXT_DATE
用來改變作業的下次運行日期
SQL>EXEC DBMS_JOB.NEXT_DATE(‘478’,’SYSDATE+2’);
6、 INTERVAL
該過程用來改變作業的運行時間間隔,下面的運行時間間隔修改爲每分鐘執行一次:
SQL>exec dbms_job.interval(478,’SYSDATE+1/24/60
7、 BROKEN
該過程用於給該作業打上中斷標誌,可以在DBA_JOBS表裏面觀察該作業的BROKEN標誌知否爲中斷。例子:
SQL>EXEC DBMS_JOB.BROKEN(478,TRUE);
SQL>COMMIT;
8、 RUN
該過程用來執行該作業,例子:
SQL>EXEC DBMS_RN(478);
SQL>COMMIT;
常見問題:
1、 如何停止一個作業?
SQL>DBMS_JOBS.BROKEN(2,TRUE);
SQL>COMMIT;
這裏務必要提交哈!
2、 如何啓動一個作業?
SQL>DBMS_JOBS.BROKEN(2,FALSE);
SQL>COMMIT;
這裏也務必要提交,否則就沒有效果
3、 前面提到的JOB_QUEUE_PROCESSES在什麼地方設置?
ALTER SYSTEM SET job_queue_processes=39 SCOPE=SPFILE;
這個SQL的執行是需要具備相應的權限的。
4、 如何計算一個過程運行的時間(DATE和TimeStamp)?
可以在過程的開始設置一個時間,然後在過程的結尾處設置一個時間,然後兩個時間的時間差可以計算出該過程運行的時間。通過實踐發現使用SYSESTAMP來計算時間比較準確一些:
SELECT to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff4') FROM dual;