1. 程式人生 > >使用PL/SQL developer ORACLE 建立儲存過程、DBMS_JOB定時任務

使用PL/SQL developer ORACLE 建立儲存過程、DBMS_JOB定時任務

由於需要對資料庫的一個表進行定時更新,之前想在後臺寫定時任務,後來發現數據庫的dems_job比較方便,之前並沒有接觸過PL/SQL和Oracle的定時任務Job,為了實現這一需求,於是在網上找了各種資料。

建立定時任務job之前首先需要有我們要操作的資料庫表,然後我們應該先建立儲存過程,在PL/SQL Developer中,我們新開啟一個Program Window,如圖1所示。

圖①新開啟一個 Program Window

儲存過程:

create or replace procedure proce_t is begin  sql;  commit; end proce_t;

sql為要執行的語句。

編寫完成後,選擇執行按鈕,儲存過程一般編譯通過的話是會提示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