job裏面的last_date和next_date,以及interval之間是什麼關係,last_date到底是記的job的開始執行時間,還是執行結束的時間。next_date到底是job的開始時間還是結束時間加上interval得出的呢?
如果一個Job的執行時間比較長(比如超過了interval),會不會出現多個同樣的job同時執行呢?
last_date=開始時間
last_date+interval=next_date
但要清楚,next_date通常不是真正的開始時間,真正的開始時間往往比next_date晚幾秒,也就是延時。
1
job的next time是在job開始執行的時候就算好了
不過是在job成功執行之後才寫上去
當job的執行時間超過interval時候也就是說在job的執行過程中nexttime就已經過了
那麼nexttime就變爲job執行完時的時間
2
SQL> exec dbms_job.broken(21,true);
PL/SQL過程被成功完成
SQL> select * from user_jobs;
SQL> exec dbms_job.run(21);
PL/SQL過程被成功完成
SQL> select * from user_jobs;
試寫一計劃任務:
declare
v_job number :=1;
begin
dbms_job.submit(v_job,'sp_fact_charge_code;',sysdate,'sysdate+1/1440');
commit;
end;
/
解釋一下上面的程序
程序主體有四個參數,分別意爲:v_job是計劃任務號,'sp_fact_charge_code'是計劃任務名,如果是多個計劃任務,就都用分號隔開,第三個sysdate意爲立即執行此任務,第四個參數是間隔時間的設置,此處爲每分鐘執行一次,1/1440=1/24/60。
查看任務:select * from user_jobs;select * from all_jobs;
查看正在運行的任務(不推薦使用,速度慢):select * from dba_jobs_running;
另外值得一提的是,在安裝oracle配置的時候,有這麼一個參數:
job_queue_processes=4 (默認4)
這個參數是定義當前最多可同時運行幾個job,它的最大值能設置爲36。
除了submit參數外,其餘的幾個參數有:
dbms_job.run(v_job); //運行job
dbms_job.broken(v_job,true,next_date); //停止一個job,裏面參數true也可是false,next_date(某一時刻停止)也可是sysdate(立刻停止)。
dbms_job.remove(v_job); //刪除某個job
dbms_job.what(v_job,'sp_fact_charge_code;'); //修改某個job名
dbms_job.next_date(v_job,sysdate); 修改下一次運行時間
例題,設定每天2:10:10運行
trunc(sysdate)+2/24+10/24/60+10/24/60/60 //運行時間
trunc(sysdate)+1+2/24+10/24/60+10/24/60/60 //間隔運行時間
例題,設定每月2號的2:10:10運行
trunc(sysdate,'mm')+1+2/24+10/24/60+10/24/60/60 //運行時間
trunc(add_mouths(sysdate,1),'mm')+1+2/24+10/24/60+10/24/60/60 //間隔運行時間
例題,設定每個季度……
trunce(sysdate,'Q')+1+2/24+10/24/60+10/24/60/60 //運行時間
trunce(add_mouths(sysdate,3),'Q'))+1+2/24+10/24/60+10/24/60/60 //間隔運行時間
另外年爲'Y;
例題,設定每週一……
next_day(sysdate'星期一')