Oracle 定時作業Job詳解

2021-09-12 08:38:38 字數 4803 閱讀 4613

oracle 定時作業job :用於安排和管理作業佇列,通過使用作業,可以使oracle資料庫定期執行特定的任務。而且oracle重新啟動後,job會繼續執行,不用重新啟動。

場景:(1)後台業務統計,如實現定時器任務業務場景每天統計訂單數;

(2)電信移動報表統計,如峰值、話單

(3)批量資料同步,如oracle 對 oracle,sqlserver to oracle等

(4)電價系統

(5)  計費系統 

在很多應用場景中,應用程式的執行是有時間限制的,比如**的後台統計、評價系統,通常會選擇訪問量和資料負荷較小的時間段來執行。限制應用的執行時間有很多種實現方式,包括作業系統級的,比如 windows 下的定時任務和 linux/unix 中的 crontab;平台應用級的,比如 jdk 中的 timer 和各種程式設計框架、資料庫等系統中所提供的定時任務 api。關聯式資料庫定時作業 尤以oracle和sqlserver 為例。

1.建立作業job

declare

job_id number;

begin

sys.dbms_job.submit(job_id, 'job_batch_p_test;', sysdate, 'sysdate+1/1440'); --每隔一分鐘執行一次

sys.dbms_output.put_line(job_id); --輸出job id

end;

2.檢視job運**況

--相關檢視

--需要dba許可權

select * from dba_jobs;

--需要dba許可權

-- 正在執行job

select * from dba_jobs_running;

select * from all_jobs;

select * from user_jobs;

-- 其中最重要的字段就是job這個值就是我們操作job的id號,what 操作儲存過程的名稱,next_date 執行的時間,interval執行間隔

3. 啟動作業job

begin

dbms_job.run(101);--執行指定job 和select * from user_jobs;中的job值對應

end;

4.刪除作業job

begin

dbms_job.broken(101,true);

dbms_job.remove(101); --101為作業id

end;

-- broken方法並不會立即中斷job的執行,最好是找到job對應的執行緒kill掉。

job 相關檢視查詢說明

-- 查詢字段描述

字段(列) 型別 描述

job number 任務的唯一標示號

log_user varchar2(30) 提交任務的使用者

priv_user varchar2(30) 賦予任務許可權的使用者

schema_user varchar2(30) 對任務作語法分析的使用者模式

last_date date 最後一次成功執行任務的時間

last_sec varchar2(8) 如hh24:mm:ss格式的last_date日期的小時,分鐘和秒

this_date date 正在執行任務的開始時間,如果沒有執行任務則為null

this_sec varchar2(8) 如hh24:mm:ss格式的this_date日期的小時,分鐘和秒

next_date date 下一次定時執行任務的時間

next_sec varchar2(8) 如hh24:mm:ss格式的next_date日期的小時,分鐘和秒

total_time number 該任務執行所需要的總時間,單位為秒

broken varchar2(1) 標誌引數,y標示任務中斷,以後不會執行

interval varchar2(200) 用於計算下一執行時間的表示式

failures number 任務執行連續沒有成功的次數

what varchar2(2000) 執行任務的pl/sql塊

current_session_labelraw mlslabel 該任務的信任oracle會話符

clearance_hi raw mlslabel 該任務可信任的oracle最大間隙

clearance_lo raw mlslabel 該任務可信任的oracle最小間隙

nls_env varchar2(2000) 任務執行的nls會話設定

misc_env raw(32) 任務執行的其他一些會話引數

建立job語法說明

declare

variable job number;

begin

sys.dbms_job.submit(job => :job,

what => 'prc_name;', --執行的儲存過程的名字

next_date => to_date('22-11-201309:09:41', 'dd-mm-yyyy hh24:mi:ss'),

interval =>'sysdate+1/86400'); --每天86400秒鐘,即一秒鐘執行prc_name過程一次

commit;

end;

使用dbms_job.submit方法過程,這個過程有五個引數:job、what、next_date、interval與no_parse。

dbms_job.submit(

job out binary_ineger,

what in varchar2,

next_date in date,

interval in varchar2,

no_parse in booean:=false)

job引數是輸出引數,由submit()過程返回的binary_ineger,這個值用來唯一標識乙個工作。一般定義乙個變數接收,可以去user_jobs檢視查詢job值。

what引數是將被執行的pl/sql**塊,儲存過程名稱等。

next_date引數指識何時將執行這個工作。

interval引數何時這個工作將被重執行。

no_parse引數指示此工作在提交時或執行時是否應進行語法分析——true,預設值false。指示此pl/sql**在它第一次執行時應進行語法分析,而false指示本pl/sql**應立即進行語法分析。

定時表示式

--每天執行一次

'sysdate + 1'

--每小時執行一次

'sysdate + 1/24'

--每10分鐘執行一次

'sysdate + 10/(60*24)'

--每30秒執行一次

'sysdate + 30/(60*24*60)'

--每隔一星期執行一次

'sysdate + 7'

--每個月最後一天執行一次

'trunc(last_day(add_months(sysdate,1))) + 23/24'

--每年1月1號零時

'trunc(last_day(to_date(extract(year from sysdate)||'12'||'01','yyyy-mm-dd'))+1)'

--每天午夜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)'

--每個月最後一天的23點

'trunc (last_day (sysdate)) + 23 / 24'

--每個季度最後一天的晚上11點

'trunc(add_months(sysdate + 2/24, 3 ), 'q' ) -1/24'

--每星期六和日早上6點10分

'trunc(least(next_day(sysdate, ''saturday"), next_day(sysdate, "sunday"))) + (6*60+10)/(24*60)'

結束語:oracle 定時作業 job 一般與儲存過程結合使用,

oracle建立定時作業(job)

oracle的job和windows的定時指令碼差不多,oracle的,具體如下 建立job語句 begin sys.dbms job.submit job job,what to17 check next date to date 14 11 2014 06 00 00 dd mm yyyy hh...

Oracle中定時作業(Job)使用方法詳解

初次接觸到專案需要用定時排程,資料備份任務。所以上網也查閱了很多資料,由此依據自己的學習能力整理下,請大家多補充多支援下。用oracle的儲存過程,可以讓我們在編寫程式的時候減少很多的量,利用oracle良好的效能作為基礎,直接能提公升程式的執行效率和穩定的效能。定時執行儲存過程的時候,就要用到 o...

ORACLE學習筆記(二) 定時作業JOB

每天6點執行一次 declare jobno number begin dbms job.submit jobno,delete straininfo trunc sysdate 1 6 24,trunc sysdate 1 1 6 24 commit end 每天12點執行一次 declare j...