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...