oracle job(定時任務)

建立 定時任務 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; -- 更新定時任務臨界值
相關文章
相關標籤/搜索