使用DBMS_JOB包建立ORACLE定時任務

來源:互聯網
上載者:User

標籤:

在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;

 

樣本:

var jobno number;

begin

dbms_job.submit(:jobno,‘p_xxx_taxis;‘,trunc(sysdate)+(18/24),‘trunc(sysdate+1,‘‘hh‘‘)‘);--每天18點執行

commit;

end;

上面這段話要在 命令視窗 下運行,如在pl/sql developer裡面的-->新鍵-->命令視窗

使用DBMS_JOB包建立ORACLE定時任務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.