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