二話不說先上代碼
--創建存儲過程
create or replace procedure job_truncateState is
begin
--此處就是要定時執行的sql
execute immediate 'TRUNCATE TABLE T_TOKEN';
end;
/
declare job number;
begin
sys.dbms_job.submit(job, 'job_truncateState;', sysdate, 'TRUNC(sysdate)+1+12/(24)');
end
commit;
/
commit;
細節說明
-
這段代碼可用plsql工具new菜單欄下的sql window執行,如果不想創建存儲過程procedure,可以直接用job window創建,只是此時生成的腳本無法使用sql window執行。該方法用工具操作很簡單,此處就不舉例啦(啊喂,要學會舉一反三好不,。。。別揭我短畢竟懶啊哈哈哈)
-
加上這個“execute immediate”,不為裝13,起初還以為是我哪里符號出了問題,還是博客大法好,這不,前人留下經驗之談,如果不加的話就會編譯異常而導致創建失敗,具體原因還未去了解。有興趣的完全可以拋棄此文揚長而去觀摩其他大佬的文章~
-
要執行的sql還有job.submit里邊job名字后面,都要記得加分號,不然可能同樣會引起編譯異常,養成好習慣記得加上最好啦哈哈哈。
-
job number在聲明declare后系統會給你分配一個,同樣用job window創建時,無需畫蛇添足手動添加作業務號,我還沒試過,有興趣的可以踩踩更大的坑哈哈哈。
-
sysdate是下一次執行時間next_date。用sql創建時必須顯示指定,系統會自己算(Pass:此處指oracle數據庫的系統時間,暗中觀察比實際時間要稍慢,引起原因多種多樣,一時說不清,所以不要大驚小怪即可= =)也就是sysdate,用job window創建時可以不指定,同樣都是默認用創建job的時間。
-
重頭戲之時間設置。代碼中TRUNC(sysdate)+1+12/(24)意思 是每天十二點執行一次,具體語法此處不多敖述,下方貼上多個實例,大家多看幾眼對比一下就懂了哎我說真的。
- 創建完畢可在procedures文件夾查看存儲過程,在DBMS_Jobs查看作業。一般創建后系統就會自動運行。
查看運行效果
select job,last_date,next_date,broken,failures from user_jobs
一般看這幾個足夠了,願意的話直接查看所有也行,其他字段沒啥好看的。都是字面意思,需要說明的就只有兩個。broken指是否正在運行,N表示正在運行,Y表示已停止;failures指失敗次數,不論是右鍵手動run還是用sql跑,失敗次數都會記錄。user_jobs指當前用戶擁有的所有job。
那么問題來了
做完以上動作我竟然只運行了一次!也就是剛手動run的時候執行了一次就不再執行了,當然我也不是說第二天才知道結果,畢竟第一次搞這個,我會先用30秒執行一次來確保能夠執行,然后再把時間換做每天十二點即可。慶幸的是我有這個習慣,不幸的是果不其然不是我的錯,我和我的編譯器都驚呆了!不恥下問的吱了領導一聲,說是數據庫配置的問題——job_queue_processes。這不,幾分鍾的事搞了我幾個小時,姜還是老的辣啊實在可怕...由於不是我自己解決的,雖然有查到問題所在,但是沒有權限去嘗試,這里就不誤導大家啦,隨便一搜“dbms_job 只執行一次”等關鍵字就有許多大佬篇章,有興趣有條件的自己去嘗試啦~
那又如何停止
1. 查看作業號
就是上面查看運行效果的sql
2. 停止作業
begin
dbms_job.broken(這里是你的job號, true, sysdate);
commit;
end;
/
3. 查看是否停止成功
還是上面查看運行效果的sql,如果broken字段值為Y就說明停止成功。
總結
其實並沒有抱怨說浪費多少時間,只是小白就應該如此去多踩坑,然后自學,查資料,一步一步,印象才會深刻。當然啦也要講方法,還有就是遇到問題后要懂得如何根據關鍵字搜索,腦筋稍微轉轉彎還是必要的,總不能說,搞了一整天連相關的關鍵字都說不出來,那就說不過去了吧。呵呵,作為碼畜的我居然說起大道理來,實在是打臉,慚愧。雖有食言畢業前不花時間作技術文,可怎么想都應該做個筆記,又不想花時間以后還要再搬一次,干脆一次性弄完算了呼~