使用DBMS_JOB創建oracle定時任務

在Oracle的包裏面,有一個名字叫做DBMS_JOB的包,它的作用是安排和管理作業隊列。通過作業隊列,可以讓Oracle數據庫定期執行特定的任務。當使用DBMS_JOB管理作業的時候,必須確保設置了初始化參數JOB_QUEUE_PROCESSES(不能爲0)。

 

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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章