【Oracle】使用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作業的例子:

 

--如果表存在就刪除,然后創建一個新表
drop table testjob cascade constraints;
create table testjob(
id number constraint testjob_id_pk primary key,
name varchar2(30)
);

--如果序列存在就刪除,然后創建一個序列
drop sequence testjob_id_seq;
create sequence testjob_id_seq;

--創建一個序列,每一次向表中插入一條數據,並且表中的id字段值使用序列指定
create or replace procedure insert_job
is
begin
  insert into testjob values(testjob_id_seq.nextval,'test'||testjob_id_seq.currval);
  commit;
end;
/

declare
  jobno binary_integer;
begin
  --提交,操作的時間間隔設置為1分鍾
  dbms_job.submit(jobno,'insert_job();',sysdate,'sysdate+1/(24*60)');
  --打印序列號
  dbms_output.put_line('jobno='||jobno);
  --運行
  dbms_job.run(jobno);
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;

 

原文連接:使用DBMS_JOB包創建Oracle定時任務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM