oracle創建定時器詳解|interval屬性


定時任務首先先創建定時任務中的存儲過程

create or replace procedure pro_jggl as                                          --創建存儲過程

begin                                 --begin和end中間的就是pl/sql

  delete yl_jggl where jjgbh = 'JGBM171002000407';                --sql 定時任務運行時觸發的sql

  commit;                        --提交sql

end;                                

這樣就新建了個名為 pro_jggl的定時任務存儲過程

然后在創建定時任務

declare jobno number;                                                --系統會自動分配一個jobno的定時任務號

begin

  dbms_job.submit(job=> jobno,                              --是把job賦值為jobno,job名稱

          what=>'pro_jggl;',           --what賦值 這里是job綁定的存儲過程  ****注意:這里引號中的存儲過程名后面要加上分號。

          next_date=>sysdate,               --next_date賦值  這里是下次定時任務運行時的時間 sysdate是系統時間  也就是立即執行

          interval=>'sysdate+1/(24*60)'  --interval 賦值 這里是定時任務運行時每次的間隔時間  1/(24*60)是說明一分鍾  1天除以24*60就是一分鍾  關於時間會在后面詳解。

  )

end;

如果出現ora報錯說不是所有變量都以綁定,說明 在

這里沒有賦值。

-------------------------------------------job修改------------------------------------------------------

dbms_job.remove(jobid);       --刪除job這個定時任務

dbms_job.what(jobid,'pro_job_jggl;')     --修改job定時任務的存儲過程

dbms_job.next_date(jobid,to_date('2018-01-04 12:00:00','yyyy-mm-dd hh24:mi:ss'))       --修改job的下次執行時間

dbms_job.interval(jobid,'sysdate+1/24')  --修改job的間隔時間

dbms_job.run(jobid);   --啟動job這個任務   

dbms_job.broken(jobid,true)   --這個true為broken的boolean值  true的時broken為‘Y’定時任務停止   false的時候就為‘N’定時任務運行

***注意:這些語句為plsql語句  放到 begin  end中執行,這里的jobid用的是 job的id, 查詢user_jobs查看當前job的id

 

-----------------------------------job並發量(隊列)---------------------------------------------------------------

select * from v$parameter where name = 'job_queue_processes';   --查看job_queue_processes參數  就是並發量

alert system set job_queue_processes = 10 ;     --修改job的並發量個數

 

----------------------------關於job的表----------------------------

select * from user_jobs查看當前用戶運行的job情況,可以查看到創建的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 下一次定時運行任務的時間

 select * from dba_jobs --查詢job的信息

兩張表都是視圖

user_jobs 查詢當前用戶的job  

dba_jobs 是查詢所有的。

DBA_JOBS_RUNNING 是查詢運行着的job

當broken為N時  就是啟動了,為y時就是停掉了。

 

 

-----------------------------------定時任務的屬性interval詳解--------------------------------------

Internal參數是一個表示Oracle合法日期表達式的字符串。這個日期字符串的值在每次任務被執行時算出,算出的日期表達式有兩種可能,要么是未來的一個時間要么就是null。這里要強調一點:很多開發者都沒有意識到next_date是在一個任務開始時算出的,而不是在任務成功完成時算出的。

當任務成功完成時,系統通過更新任務隊列目錄表將前面算出的next_date值置為下一次任務要運行的時間。當由interval表達式算出next_date是null時,任務自動從任務隊列中移出,不會再繼續執行。因此,如果傳遞一個null值給interval參數,則該任務僅僅執行一次。

通過給interval參數賦各種不同的值,可以設計出復雜運行時間計划的任務。

在interval中

sysdate+1/24     --這個是間隔一個小時

sysdate+1         --這個是間隔一天

sysdate+7         --這個是間隔一個星期

 

'TRUNC(SYSDATE + 1)'         每天午夜12點

'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'    每星期二中午12點

'TRUNC(LAST_DAY(SYSDATE ) + 1)'     每個月第一天的午夜12點

'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' 每個季度最后一天的晚上11點

'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

無論通過怎樣設置interval日期表達式也不能滿足要求。這時因為一個任務的下一次運行時間在任務開始時才計算,而在此時是不知道任務在何時結束的。遇到這種情況怎么辦呢?當然辦法肯定是有的,我們可以通過為任務隊列寫過程的辦法來實現。這里我只是簡單介紹以下,可以在前一個任務隊列執行的過程中,取得任務完成的系統時間,然后加上指定的時間間隔,拿這個時間來控制下一個要執行的任務。這里有一個前提條件,就是目前運行的任務本身必須要嚴格遵守自己的時間計划。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM