一:簡單測試job的建立過程案例:
sql
1,先建立一張JOB_TEST表,字段爲a 日期格式 測試
SQL> create table JOB_TEST(a date); this
Table created spa
SQL> commit; rem
Commit complete qt
2,建立一個存儲過程 bb 做用是往pig表中插入數據 it
SQL> create or replace procedure JOB_PRO_TEST as table
2 begin ast
3 insert into JOB_TEST values(sysdate); date
4 end;
5 /
Procedure created
3,建立一個job,名稱爲job2010 ;做用是每分鐘(60×24=1440)執行一次存儲過程JOB_PRO_TEST。
SQL> variable job2010 number;
SQL> begin
2 dbms_job.submit(:job2010,'JOB_PRO_TEST;',sysdate,'sysdate+1/1440');
3 end;
4 /
注意:這裏系統自動生成job id 爲41
PL/SQL procedure successfully completed
job2010
---------
41
4,運行job2010
SQL> begin
2 dbms_job.run(:job2010);
3 end;
4 /
PL/SQL procedure successfully completed
job2010
---------
41
5,刪除job2010
SQL> begin
2 dbms_job.remove(:job2010);
3 end;
4 /
6,查詢jobs的相關視圖
select job,last_date,last_sec,broken,failures,interval, what from dba_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)'
每個月25號00:00執行: 'TRUNC(LAST_DAY(SYSDATE ) + 25)'
--------------------------
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
3. 查看相關job信息
相關視圖
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在運行job相關信息
三:實際應用
步驟一:建立一個job,每個月25日執行下面sql。
SQL> variable job2010 number;
SQL> begin
SQL> dbms_job.submit(:job2010,'delete from i0216_inv_balance_curstock where trunc(sysdate-mtime) > 90 and 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> /