定時執行存儲過程在平時開發中經常會用到,年前的時候自己也做了一個,由於時間關系一直沒能記錄,現記錄下來。
首先用一個完整的例子來實現定時執行存儲過程。
任務目標:每小時向test表中插入一條數據
實現方案:
1.通過 oracle 中 dbms_job 完成存儲過程的定時調用
2.在存儲過程中完成相應的邏輯操作
實現步驟:
1.創建一個測試表
create table test(dTime date);
2.創建一個存儲過程
create or replace procedure p_test as
begin
insert into test values(sysdate);
end;
3.創建執行計划:每小時運行一次存儲過程
Declare
i Integer;
Begin
dbms_job.submit(i,'p_test;',Sysdate,'sysdate+1/24');
end;
4.運行執行計划
Declare
jobno Integer;
Begin
-- 查找計划號
Select t.JOB into jobno From User_Jobs t ;
-- 運行制定的執行計划
dbms_job.run(jobno);
end;
5.查看任務隊列情況
select job,next_date,next_sec,failures,broken from user_jobs;
6.查看任務執行情況
select to_char(dTime ,'yyyy/mm/dd hh24:mi:ss') from test order By dTime;
7.停止執行計划
Declare
jobno Integer;
Begin
-- 查找計划號
Select t.JOB into jobno From User_Jobs t ;
-- 停止計划,不再繼續執行
--dbms_job.broken(jobno,True);
-- 停止計划,並在兩分鍾后繼續執行
dbms_job.broken(jobno,True,Sysdate+(2/24/60));
end;
8.刪除執行計划
Declare
jobno Integer;
Begin
-- 查找計划號
Select t.JOB into jobno From User_Jobs t ;
dbms_job.remove(jobno);
end;
9.修改執行計划
Declare
jobno Integer;
Begin
-- 查找計划號
Select t.JOB into jobno From User_Jobs t ;
-- 修改為:每分鍾執行一次
dbms_job.interval(jobno, 'sysdate+1/(24*60)');
end;
參數說明:
DBMS_JOB.SUBMIT(jobno =>jobID,//對應的唯一id(jobID <-> jobName)唯一映射
procedureName=> 'your_procedure;', //調用的存儲過程名稱
next_date => sysdate, //下次執行的時間(第一次執行的時間)
interval => 'sysdate+1/1440'); //每次執行間隔的時間
以上就是定時執行存儲過程的全部內容,留待后用吧。
http://lafecat.iteye.com/blog/2186568