Oracle定時任務
一、創建語句
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自動生成JOB_ID*/
WHAT => 'proc_cam;',
NEXT_DATE => to_date('2022-03-14 15:40:00', 'yyyy-mm-dd hh24:mi:ss'),
INTERVAL => 'sysdate+30/(24*60)' /*每隔30分鍾執行一次*/
);
commit;
end;
參數含義:
JOB:指定定時任務的 JOB_ID,上面代碼指自動生成;
WHAT:需要執行的存儲過程名稱或SQL語句,多個以分號隔開,注意最后有個分號;
NEXT_DATE:初次執行時間;
INTERVAL:多久執行一次。
二、查詢定時任務
當前用戶定時任務
select * from user_jobs;
有權限訪問的定時任務
select * from all_jobs;
整個數據庫所有的定時任務
select * from dba_jobs;
查詢上面例子創建的定時任務:select * from dba_jobs where what like '%proc_cam%';
三、任務時間間隔設計
指定兩次任務執行的時間間隔
描述 | interval 參數值 |
---|---|
每天執行一次 | 'SYSDATE+1′ |
每小時執行一次 | 'SYSDATE+1/24' |
每10分鍾執行一次 | 'SYSDATE+10/(24*60)' |
每30秒執行一次 | 'SYSDATE+30/(24*60*60)' |
每個星期執行一次 | 'SYSDATE+7' |
也可以指定具體時間
描述 | 參數值 |
---|---|
每天6點 執行 | 'Trunc(Sysdate+1) + 6/24' |
每天08:10:00 執行 | 'Trunc(Sysdate+1) + (8*60+10)/24*60' |
每周一凌晨1點執行 | ' TRUNC(next_day(sysdate,"星期一"))+1/24' |
每月1日凌晨1點執行 | ' TRUNC(LAST_DAY(SYSDATE))+1+1/24' |
四、操作
手動執行定時任務
BEGIN
DBMS_JOB.RUN(1283); --1283為JOB任務的 ID
commit;
END;
停止定時任務
BEGIN
dbms_job.broken(1283,true,sysdate); --1283為JOB任務的 ID,sysdate是指在指定時間停止
commit;
END;
刪除定時任務
begin
dbms_job.remove(1283); --1283為JOB任務的 ID
commit;
end;
修改定時任務的時間間隔
begin
dbms_job.interval(1283,interval => 'TRUNC(SYSDATE)+1'); /*第一個參數為job的ID,第二個參數為interval: 計算下一次任務執行的時間表達式*/
commit;
end;
修改下一次執行時間
begin
dbms_job.next_date(1283,to_date('2022-03-15 12:00:00','yyyy-mm-dd hh24:mi:ss')); /*第一個參數:job的ID;第二個參數:要修改后的計算下一次執行的時間表達式*/
commit;
end;
修改定時任務要執行的操作
begin
dbms_job.what(1283,'testJob2();'); /* 第一個參數:job的ID;第二個參數:要更改的新操作名稱(存儲過程名稱或SQL語句,必須存在)*/
commit;
end;