導讀:
第一部分:下面的步驟完整的示範了job的建立過程:
第二部分:job的相關知識:
第三部分:實際應用
發現:刪除jobs的時候必須使用該job的owner來做,sys也不能刪別人的job!(先這樣理解,以後再更正。嘿嘿·)
本文:
第一部分:下面的步驟完整的示範了job的建立過程:
1,先建立一張pig表,欄位為a日期格式
SQL> create table pig(a date);
Table created
SQL> commit;
Commit complete
2,建立一個預存程序bb作用是往pig表中插入資料
SQL> create or replace procedure bb as
2 begin
3 insert into pig values(sysdate);
4 end;
5 /
Procedure created
3,建立一個job,名稱為job2009;作用是每分鐘(60×24=1440)執行一次預存程序bb。
SQL> variable job2009 number;
SQL> begin
2 dbms_job.submit(:job2009,'bb;',sysdate,'sysdate+1/1440');
3 end;
4 /
注意:這裡系統自動產生job id為41
PL/SQL procedure successfully completed
job2009
---------
41
4,運行job2009
SQL> begin
2 dbms_job.run(:job2009);
3 end;
4 /
PL/SQL procedure successfully completed
job2009
---------
41
5,刪除job2009
SQL> begin
2 dbms_job.remove(:job2009);
3 end;
4 /
6,查詢jobs的相關視圖
selectjob,last_date,last_sec,broken,failures,interval, whatfromdba_jobs
詳解dba_jobs中幾個比較重要的欄位
job:指的是job的id號。比如上面的41
failures:job執行的時候失敗次數,如果超過了15次,那麼broken列將被標為Y,以後就不會運行該job了
broken:預設為N,如果為Y,意味著不再執行該job!
interval:執行job的間隔時間。
what:該job的實際工作。
第二部分:job的相關知識:
1,DBA_JOBS
DBA_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_LABEL RAW MLSLABEL該任務的信任Oracle會話符
CLEARANCE_HI RAW MLSLABEL該任務可信任的Oracle最大間隙
CLEARANCE_LO RAW MLSLABEL該任務可信任的Oracle最小間隙
NLS_ENV VARCHAR2(2000)任務啟動並執行NLS會話設定
MISC_ENV RAW(32)任務啟動並執行其他一些會話參數
--------------------------
2,描述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)'
--------------------------
1:每分鐘執行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)
或
Interval => sysdate+1/1440
2:每天定時執行
例如:每天的淩晨1點執行
Interval => TRUNC(sysdate) + 1 +1/ (24)
3:每周定時執行
例如:每周一淩晨1點執行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定時執行
例如:每月1日淩晨1點執行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定時執行
例如每季度的第一天淩晨1點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定時執行
例如:每年7月1日和1月1日淩晨1點
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定時執行
例如:每年1月1日淩晨1點執行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24
第三部分:實際應用
-->-->--></STYLE. < P>
步驟一:建立一個job,每月25日執行下面sql。
SQL>variable job2010 number;
SQL>begin
SQL>dbms_job.submit(:job2010,'delete from i0216_inv_balance_curstock where trunc(sysdate-mtime) > 90and ib_qty = 0;commit;',sysdate,'TRUNC(LAST_DAY(SYSDATE ) + 25)'); <==每月25號00:00執行
SQL>end;
SQL>/
步驟二:查詢產生的job id
SQL> select job, what from dba_jobs;
job what
61 ..........
步驟三:運行剛才建立的job
SQL> begin
SQL> dbms_job.run(61);
SQL> end;
SQL> /
步驟四:查詢該job下次執行的時間
SQL> select job,next_date,what from dba_jobs
SQL> where job=’61’;
步驟五:刪除該job
SQL> begin
SQL> dbms_job.remove(61);
SQL> end;
SQL> /