建立 定時任務 jobsql
declare job number; BEGIN DBMS_JOB.SUBMIT( JOB => job, -- job任務的惟一標識(自動生成) WHAT => 'INSERT into TEXTL (id) VALUES(TEXTL_SEQ.NEXTVAL);', -- 須要執行的存儲過程或者sql語句 NEXT_DATE => sysdate, -- 第一次運行時間,sysdate表明當即運行 INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' -- 運行間隔 這裏是每一分鐘運行一次 具體寫法參照如下說明 ); commit; end;
INTERVAL參數說明數據庫
1.天天午夜12點:''TRUNC(SYSDATE + 1)'' 2.天天早上8點30分:''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'' 3.每星期二中午12點:''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24'' 4.每月第一天的午夜12點:''TRUNC(LAST_DAY(SYSDATE ) + 1)'' 5.每一個季度最後一天的晚上11點:''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24'' 6.每星期六和日早上6點10分:''TRUNC(LEAST(NEXT_DAY(SYSDATE,''''SATURDAY"), NEXT_DAY(SYSDATE,"SUNDAY")))+ (6×60+10)/)24×60)'' 7.每3秒鐘執行一次:'sysdate+3/(24*60*60)' 8.每2分鐘執行一次:'sysdate+2/(24*60)' 9:每分鐘執行: Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分鐘執行 Interval => 'sysdate+1/(24*60)' --每分鐘執行 Interval => 'sysdate+1' --天天 Interval => 'sysdate+1/24' --每小時 Interval => 'sysdate+2/24*60' --每2分鐘 Interval => 'sysdate+30/24*60*60' --每30秒 10:天天定時執行: Interval => TRUNC(sysdate+1) --天天凌晨0點執行 Interval => TRUNC(sysdate+1)+1/24 --天天凌晨1點執行 Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --天天早上8點30分執行 11:每週定時執行: Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每週一凌晨1點執行 Interval => TRUNC(next_day(sysdate,1))+2/24 --每週一凌晨2點執行 12:每個月定時執行: Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每個月1日凌晨0點執行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每個月1日凌晨1點執行 13:每季度定時執行: Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第一天凌晨0點執行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第一天凌晨1點執行 Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最後一天的晚上11點執行 14:每半年定時執行:ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每一年7月1日和1月1日凌晨1點 15:每一年定時執行:ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每一年1月1日凌晨1點執行
查看數據庫中定時任務code
SELECT * from dba_jobs; -- 庫中全部的定時任務 SELECT * from user_jobs; -- 當前用戶的定時任務
查看定時任務字段意思:rem
JOB:任務的惟一標識碼 LOG_USER:提交任務的用戶 PRIV_USER:賦予任務權限的用戶 SCHEMA_USER:對用戶做語法分析的用戶模式 LAST_DATE:最後一次成功執行任務的時間 LAST_SEC:最後一次成功執行任務的時間的時分秒 THIS_DATE:正在執行的任務的開始時間,若沒有則爲空 THIS_SEC:正在執行的任務的開始時間的時分秒,若沒有則爲空 NEXT_DATE:下一次執行定時任務的時間 NEXT_SEC:下一次執行定時任務的時間的時分秒 TOTAL_TIME:執行當前任務所須要的時間,單位:秒 BROKEN:標誌參數,Y表示任務中斷,之後不會再運行 INTERTAL:計算下一次執行定時任務的時間表達式 FAILURES:當前定時任務執行失敗的總次數 WHAT:執行任務的PL/SQL代碼塊 NLS_ENV:任務執行的NLS會話設置 MISC_ENV:定時任務運行的其餘一些參數設置 INSTANCE:標識當前任務運行是否受限,0 沒有受限
手動調用定時任務it
begin DBMS_JOB.RUN(job); -- job:任務的惟一標識碼,具體值使用查看數據庫中定時任務SQL能夠查詢出 end;
中止定時任務class
begin dbms_job.broken(job,true,next_date); -- job:任務的惟一標識碼,第二個參數true:中斷任務 false:不中斷任務,next_date:某一時刻中止 (sysdate:馬上中止)。 commit; end;
刪除定時任務date
begin dbms_job.remove(job); -- job:任務的惟一標識碼 commit; end;
修改定時任務的間隔時間(INTERVAL)定時任務
begin dbms_job.interval(job,interval); -- job:任務的惟一標識碼,interval: 計算運行間隔的時間表達式 commit; end;
修改定時任務的下一次執行時間select
begin dbms_job.next_date(job,next_date); -- job:任務的惟一標識碼,nex_date:計算下一次執行的時間表達式 commit; end;
修改定時任務的執行的操做sql語句
begin dbms_job.what(job,'INSERT into TEXTL VALUES(TEXTL_SEQ.NEXTVAL,''11'',sysdate);'); -- job:任務的惟一標識碼,第二參數:須要執行的存儲過程或sql commit; end;
若是定時任務建立成功後,定時任務只運行了一次或者沒有運行。存儲過程、sql等語句沒有出錯,按照如下方式排查:
查看定時任務的臨界值是多少,若是爲0 或者數值較小的話,將其臨界值加大就能夠了。緣由:好比定時任務數量超過10,第11個就不會執行了,0就是一個也不執行
select value from v$parameter where name like '%job_queue_processes%'; -- 查看定時任務臨界值 alter system set job_queue_processes = 10; -- 更新定時任務臨界值