最近由於需要對數據庫的一個表進行定時更新,之前並沒有接觸過PL/SQL和Oracle的定時任務Job,只是在Java Web項目中寫過一些dao層的一些增刪改查SQL語句。為了實現這一需求,於是在網上找了各種資料,最后發現PL/SQL developer 在DBMS_JOB的創建定時任務job時提供了許多方便,本人使用的是PL/SQL Developer Version 8.0.4.1514 。
Oracle數據庫在Oracle 10G新增了DBMS_SCHEDULER的功能,比較之前使用的DBMS_JOB,其功能更強也更安全,但是細節問題太多,對於我這個新手來說看着有點頭大。於是選擇了DBMS_JOB。
創建定時任務job之前首先需要有我們要操作的數據庫表,然后我們應該先建立存儲過程,在PL/SQL Developer中,我們新打開一個Program Window,如圖1所示。
圖1 新打開一個 Program Window
存儲過程的代碼編寫這里就略過,有什么不懂的就谷歌吧,一定能解決你的問題的!編寫完成后,選擇執行按鈕,存儲過程一般編譯通過的話是會提示compiled successfully的,如果有問題的話PL/SQL是會直接提示錯誤信息的,你按照提示進行修改就行。這里需要說明的是,存儲過程成功編譯通過,創建好job后,執行job卻始終執行錯誤,提示執行失敗,這是你也得回頭看看很可能是你的存儲過程有運行錯誤(這里我也不知道怎么稱呼,較java里面的說法,暫時這樣稱呼吧)。像我這次就碰到這種情況,弄得我好生郁悶。這里推薦你自己先test一下自己編寫的存儲過程,是不是存在運行問題。執行test操作可以這樣:在procedures目錄下,找到那個你剛剛創建好的存儲過程,單擊右鍵選擇”test“,這時會彈出”test window“,選擇執行按鈕
,這樣就可以避免因為存儲過程造成的job不能運行的錯誤了。
創建好正確的存儲過程后,我們要建立一個job。選擇DBMS_Jobs目錄,並單擊右鍵,選擇 New,這是便會彈出一個job創建對話框,如圖2所示。
圖2 dbms_job創建對話框
由上圖可以知道,其中what,Next date,Interval是需要我們填寫的,Borken一般不要勾選,下面詳細說下這三項的寫法:
1、what
what項是填寫執行的任務的名稱及其輸入參數。這里由於沒有涉及到輸入參數,所以我只寫了存儲過程名,需要注意的是格式必須是:存儲過程名;。例如我新建的存儲過程叫proc_test,那么what項就應該寫成這樣 ”proc_test;" ,雙引號只是格式需要,請無視。(注意分號千萬不能忘了寫了,當然你忘了系統會提示你job創建錯誤的,嘿嘿)
2、Next date
Next date項是填寫job下次的執行時間,一般我們不立即執行的話,那么這個就是job第一次執行的時間了。具體格式的話可以參考網上的,很詳細。這里我說下我常用的格式吧。(貌似也可以不填,那么Apply之后會變成當前系統時間,然后可以選中job號單擊右鍵run立即執行。)
為了說明清楚,首先需要知道sysdate是oracle數據庫的系統時間,可以使用 select sysdate from dual來查看當前系統時間。在oracle中sysdate+1表示當前的時間加一天,也就是明天這個時候,其中的1表示1天,那么一個小時就可以表示為1/24,一分鍾1/1440。如果我想要在當前的時間的兩小時后執行那么就可以填為sysdate+1/12。如果想要獲得整點時間建議使用trunc()函數,trunc(sysdate)是表示當前日期的零點,比如說我要讓它在今天晚上的9點開始執行的話,可以這樣寫trunc(sysdate)+21/24。具體的時間可以根據自己的需求來寫。當然還可以使用to_date()的寫法,這里不說了,個人覺得沒必要拼字符串,麻煩。
3、Interval
Interval項表示job任務執行的時間間隔,可以不填。如果每填的話默認值為null,這樣job就執行一次就停止了。如果我們需要定時執行任務,那這項就必填不可了。
格式其實和Next date一樣,這里舉個例子,如果我需要該任務每天凌晨兩點執行的話,可以這樣寫:trunc(sysdate)+1+1/12。其他的可以以此類推,就不再說明了。
確認填寫完成后,單擊”Apply",如果填寫無誤的話,就生成了一個job,在dbms_job目錄下可以看到,剛創建好的job編號是有雙引號的。填寫有錯的話就好好檢查下哪里出了問題。另外需要說明的是,如果你需要立即執行的話,可以選中job,單擊右鍵,選擇"run“,任務便會立即執行。
以上是我在最近用PL/SQL Developer 創建定時任務時學習到的一些小知識,有什么理解的不對的地方,還請多多指教。
附錄一些常用的job查看sql語句:
select * from dba_jobs; //查看所有用戶的job
select * from dba_jobs_running; //查看當前正在運行的job
select * from user_jobs; //查看當前用戶的job