oracle_job引數詳解
declare
v_job number;
begin
dbms_job.submit(job => v_job,
what => 'begin
pkg_databak_bak.p_serv_flag_gsm_m_bak;
pkg_databak_bak.p_serv_flag_m_bak;
end;',
next_date => sysdate,
interval => 'add_months(trunc(sysdate), 1)');
dbms_output.put_line(v_job);
end;
select * from dba_jobs;
select * from dba_jobs_running;
1、job
引數job是乙個整數,用來唯一地標示乙個任務。該引數既可由使用者指定也可由系統自動賦予,這完全取決於提交任務時選用了那乙個任務提交過程。dbms_job.submit過程通過獲得序列sys.jobseq的下乙個值來自動賦予乙個任務號。該任務號是作為乙個out引數返回的,所以呼叫者隨後可以識別出提交的任務。而dbms_job.isubmit過程則由呼叫者給任務指定乙個識別號,這時候,任務號的唯一性就完全取決於呼叫者了。
除了刪除或者重新提交任務,一般來說任務號是不能改變的。即使當資料庫被匯出或者被匯入這樣極端的情況,任務號也將被保留下來。所以在執行含有任務的資料的匯入/匯出操作時很可能會發生任務號衝突的現象。
2、what
what引數是乙個可以轉化為合法pl/sql呼叫的字串,該呼叫將被任務佇列自動執行。在what引數中,如果使用文字字串,則該字串必須用單引號括起來。 what引數也可以使用包含我們所需要字串值的varchar2變數。實際的pl/sql呼叫必須用分號隔開。在pl/sql呼叫中如果要嵌入文字字串,則必須使用兩個單引號。
what引數的長度在oracle7.3中限制在2000個位元組以內,在oracle 8.0以後,擴大到了4000個位元組,這對於一般的應用已完全足夠。該引數的值一般情況下都是對乙個pl/sql儲存過程的呼叫。在實際應用中,儘管可以使用大匿名pl/sql塊,但建議大家最好不要這樣使用。還有乙個實際經驗就是最好將儲存過程呼叫封裝在乙個匿名塊中,這樣可以避免一些比較莫名錯誤的產生。我來舉乙個例子,一般情況下,what引數可以這樣引用:
what =>』my_procedure(parameter1);』
但是比較安全的引用,應該這樣寫:
what =>』begin my_procedure(parameter1); end;』
任何時候,我們只要通過更改what引數就可以達到更改任務定義的目的。但是有一點需要注意,通過改變what引數來改變任務定義時,使用者當前的會話設定也被記錄下來並成為任務執行環境的一部分。如果當前會話設定和最初提交任務時的會話設定不同,就有可能改變任務的執行行為。意識到這個潛在的***是非常重要的,無論何時只要應用到任何dbms_job過程中的what引數時就一定要確保會話設定的正確。
3、next_date
next_date引數是用來排程任務佇列中該任務下一次執行的時間。這個引數對於dbms_job.submit和dbms_job.broken這兩個過程確省為系統當前時間,也就是說任務將立即執行。
當將乙個任務的next_date引數賦值為null時,則該任務下一次執行的時間將被指定為2023年1月1日,也就是說該任務將永遠不再執行。在大多數情況下,這可能是我們不願意看到的情形。但是,換乙個角度來考慮,如果想在任務佇列中保留該任務而又不想讓其執行,將next_date設定為null卻是乙個非常簡單的辦法。
next_date也可以設定為過去的乙個時間。這裡要注意,系統任務的執行順序是根據它們下一次的執行時間來確定的,於是將next_date引數設定回去就可以達到將該任務排在任務佇列前面的目的。這在任務佇列程序不能跟上將要執行的任務並且乙個特定的任務需要盡快執行時是非常有用的。
4、interval
internal引數是乙個表示oracle合法日期表示式的字串。這個日期字串的值在每次任務被執行時算出,算出的日期表示式有兩種可能,要麼是未來的乙個時間要麼就是null。這裡要強調一點:很多開發者都沒有意識到next_date是在乙個任務開始時算出的,而不是在任務成功完成時算出的。
當任務成功完成時,系統通過更新任務佇列目錄表將前面算出的next_date值置為下一次任務要執行的時間。當由interval表示式算出next_date是null時,任務自動從任務佇列中移出,不會再繼續執行。因此,如果傳遞乙個null值給interval引數,則該任務僅僅執行一次。
通過給interval引數賦各種不同的值,可以設計出複雜執行時間計畫的任務。附錄的「任務間隔和日期演算法」將對interval表示式進行詳細討論,並給出乙個實際有用interval表示式的例子。
附錄:任務重複執行間隔和間隔設計演算法
任務重複執行的時間間隔取決於interval引數中設定的日期表示式。下面就來詳細談談該如何設定interval引數才能準確滿足我們的任務需求。一般來講,對於乙個任務的定時執行,有三種定時要求。
1) 在乙個特定的時間間隔後,重複執行該任務。
2) 在特定的日期和時間執行任務。
3) 任務成功完成後,下一次執行應該在乙個特定的時間間隔之後。
第一種排程任務需求的日期演算法比較簡單,即'sysdate+n',這裡n是乙個以天為單位的時間間隔。表1給出了一些這種時間間隔設定的例子。
表1 一些簡單的interval引數設定例子
描述
interval引數值
每天執行一次
'sysdate + 1'
每小時執行一次
'sysdate + 1/24'
每10分鐘執行一次
'sysdate + 10/(60*24)'
每30秒執行一次
'sysdate + 30/(60*24*60)'
每隔一星期執行一次
'sysdate + 7'
不再執行該任務並刪除它
null
表1所示的任務間隔表示式不能保證任務的下一次執行時間在乙個特定的日期或者時間,僅僅能夠指定乙個任務兩次執行之間的時間間隔。例如,如果乙個任務第一次執行是在凌晨12點,interval指定為'sysdate+ 1',則該任務將被計畫在第二天的凌晨12點執行。但是,如果某使用者在下午4點手工(dbms_job.run)執行了該任務,那麼該任務將被重新定時到第二天的下午4點。還有乙個可能的原因是如果資料庫關閉或者說任務佇列非常的忙以至於任務不能在計畫的那個時間點準時執行。在這種情況下,任務將試圖盡快執行,也就是說只要資料庫一開啟或者是任務佇列不忙就開始執行,但是這時,執行時間已經從原來的提交時間漂移到了後來真正的執行時間。這種下一次執行時間的不斷「漂移」是採用簡單時間間隔表示式的典型特徵。
第二種排程任務需求相對於第一種就需要更複雜的時間間隔(interval)表示式,表2是一些要求在特定的時間執行任務的interval設定例子。
表2. 定時到特定日期或時間的任務例子
描述
interval引數值
每天午夜12點
'trunc(sysdate + 1)'
每天早上8點30分
'trunc(sysdate + 1) + (8*60+30)/(24*60)'
每星期二中午12點
'next_day(trunc(sysdate ), ''tuesday'' ) + 12/24'
每個月第一天的午夜12點
'trunc(last_day(sysdate ) + 1)'
每個季度最後一天的晚上11點
'trunc(add_months(sysdate + 2/24, 3 ), 'q' ) -1/24'
每星期六和日早上6點10分
'trunc(least(next_day(sysdate, ''saturday"), next_day(sysdate, "sunday"))) + (6×60+10)/(24×60)'
第三種排程任務需求無論通過怎樣設定interval日期表示式也不能滿足要求。這時因為乙個任務的下一次執行時間在任務開始時才計算,而在此時是不知道任務在何時結束的。遇到這種情況怎麼辦呢?當然辦法肯定是有的,我們可以通過為任務佇列寫過程的辦法來實現。這裡我只是簡單介紹以下,可以在前乙個任務佇列執行的過程中,取得任務完成的系統時間,然後加上指定的時間間隔,拿這個時間來控制下乙個要執行的任務。這裡有乙個前提條件,就是目前執行的任務本身必須要嚴格遵守自己的時間計畫。
Oracle JOB引數詳解
oracle job引數詳解 declare v job number begin dbms job.submit job v job,what begin pkg databak bak.p serv flag gsm m bak pkg databak bak.p serv flag m bak...
Oracle Job定時任務的使用詳解
oracle中的job能為你做的就是在你規定的時間格式裡執行儲存過程,定時執行乙個任務 下面是乙個小案例,定時每15分鐘向一張表插入一條資料 一1.建立一張測試表 create table create table a8 a1 varchar2 500 tablespace dsp data pct...
oracle JOB遷移辦法
在系統遷移或公升級的時候,可能會有oracle job遷移的需求。對於10g的系統好說。可以用下面的辦法 userid as sysdba directory exp dir dumpfile expdp job.dmp logfile expdp job.log include job 對於9i庫...