Oracle job有定時執行的功能,可以在指定的時間點或每天的某個時間點自行執行任務。 而且oracle重新啟動後,job會繼續運行,不用重新啟動。
一、查詢系統中的job,可以查詢檢視
--相關視圖
select * from dba_jobs;
select * from all_jobs;
select * fromuser_jobs;
-- 查詢欄位描述
/*
欄位(列) 類型 描述
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
select * fromdba_jobs_running;
其中最重要的欄位就是job這個值就是我們操作job的id號,what 操作預存程序的名稱,next_date 執行的時間,interval執行間隔
二、執行間隔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
每星期六和日早上6點10分 TRUNC(LEAST(NEXT_DAY(SYSDATE,''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)
每秒鐘執行次 Interval => sysdate+ 1/(24 * 60 * 60)
如果改成sysdate + 10/(24 *60 * 60)就是10秒鐘執行次
每分鐘執行
Interval =>TRUNC(sysdate,'mi') + 1/ (24*60)
如果改成TRUNC(sysdate,'mi')+ 10/ (24*60) 就是每10分鐘執行次
每天定時執行
例如:每天的淩晨1點執行
Interval =>TRUNC(sysdate) + 1 +1/ (24)
每周定時執行
例如:每周一淩晨1點執行
Interval =>TRUNC(next_day(sysdate,'星期一'))+1/24
每月定時執行
例如:每月1日淩晨1點執行
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/24
每季度定時執行
例如每季度的第一天淩晨1點執行
Interval =>TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
每半年定時執行
例如:每年7月1日和1月1日淩晨1點
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
每年定時執行
例如:每年1月1日淩晨1點執行
Interval=>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
三、建立job方法
建立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代碼應立即進行文法分析。
四、其他job相關的預存程序
在dbms_job這個package中還有其他的過程:broken、change、interval、isubmit、next_date、remove、run、submit、user_export、what;
大致介紹下這些過程:
1、broken()過程更新一個已提交的工作的狀態,典型地是用來把一個已破工作標記為未破工作。這個過程有三個參數:job、broken與next_date。
procedure broken (
job IN binary_integer,
broken IN boolean,
next_date IN date := SYSDATE
)
job參數是工作號,它在問題中唯一標識工作。
broken參數指示此工作是否將標記為破——true說明此工作將標記為破,而false說明此工作將標記為未破。