Oracle定時(shí)任務(wù)

????DBMS_JOB包對(duì)于任務(wù)隊(duì)列提供了下面這些功能:提交并且執(zhí)行一個(gè)任務(wù)桑驱、改變?nèi)蝿?wù)的執(zhí)行參數(shù)以及刪除或者臨時(shí)掛起任務(wù)等。

查看job_queue_processes參數(shù):

     show parameter job_queue_processes;

如果是0嘱朽,就修改參數(shù):

alter system set job_queue_processes = 10;

DBMS_JOB包:

名稱 類型 描述
DBMS_JOB.ISUBMIT 過程 提交一個(gè)新任務(wù)昼激,用戶指定一個(gè)任務(wù)號(hào)
DBMS_JOB.SUBMIT 過程 提交一個(gè)新任務(wù),系統(tǒng)指定一個(gè)任務(wù)號(hào)
DBMS_JOB.REMOVE 過程 從隊(duì)列中刪除一個(gè)已經(jīng)存在的任務(wù)
DBMS_JOB.CHANGE 過程 更改用戶設(shè)定的任務(wù)參數(shù)
DBMS_JOB.WHAT 過程 更改PL/SQL任務(wù)定義
DBMS_JOB.NEXT_DATE 過程 更改任務(wù)下一次運(yùn)行時(shí)間
DBMS_JOB.INTERVAL 過程 更改任務(wù)運(yùn)行的時(shí)間間隔
DBMS_JOB.BROKEN 過程 將任務(wù)掛起衷畦,不讓其重復(fù)運(yùn)行
DBMS_JOB.RUN 過程 在當(dāng)前會(huì)話中立即執(zhí)行任務(wù)
DBMS_JOB.USER_EXPORT 過程 創(chuàng)建文字字符串妇斤,用于重新創(chuàng)建一個(gè)任務(wù)

????DBMS_JOB包中所有的過程都有一組相同的公共參數(shù)摇锋,用于定義任務(wù),任務(wù)的運(yùn)行時(shí)間以及任務(wù)定時(shí)運(yùn)行的時(shí)間間隔站超。
DBMS_JOB包參數(shù):

名稱 類型 描述
Job BINARY_INTEGER 任務(wù)的唯一識(shí)別號(hào)
What VARCHAR2 作為任務(wù)執(zhí)行的PL/SQL代碼
Next_date VARCHAR2 任務(wù)下一次運(yùn)行的時(shí)間
Interval VARCHAR2 日期表達(dá)式荸恕,用來計(jì)算下一次任務(wù)運(yùn)行的時(shí)間

下面我們來詳細(xì)討論這些參數(shù)的意義及用法。

1死相、job

參數(shù)job是一個(gè)整數(shù)融求,用來唯一地標(biāo)示一個(gè)任務(wù)。該參數(shù)既可由用戶指定也可由系統(tǒng)自動(dòng)賦予算撮,這完全取決于提交任務(wù)時(shí)選用了那一個(gè)任務(wù)提交過程生宛。DBMS_JOB.SUBMIT過程通過獲得序列SYS.JOBSEQ的下一個(gè)值來自動(dòng)賦予一個(gè)任務(wù)號(hào)。該任務(wù)號(hào)是作為一個(gè)OUT參數(shù)返回的钮惠,所以調(diào)用者隨后可以識(shí)別出提交的任務(wù)茅糜。而DBMS_JOB.ISUBMIT過程則由調(diào)用者給任務(wù)指定一個(gè)識(shí)別號(hào),這時(shí)候素挽,任務(wù)號(hào)的唯一性就完全取決于調(diào)用者了。

除了刪除或者重新提交任務(wù)狸驳,一般來說任務(wù)號(hào)是不能改變的预明。即使當(dāng)數(shù)據(jù)庫被導(dǎo)出或者被導(dǎo)入這樣極端的情況,任務(wù)號(hào)也將被保留下來耙箍。所以在執(zhí)行含有任務(wù)的數(shù)據(jù)的導(dǎo)入/導(dǎo)出操作時(shí)很可能會(huì)發(fā)生任務(wù)號(hào)沖突的現(xiàn)象撰糠。

2、what

what參數(shù)是一個(gè)可以轉(zhuǎn)化為合法PL/SQL調(diào)用的字符串辩昆,該調(diào)用將被任務(wù)隊(duì)列自動(dòng)執(zhí)行阅酪。在what參數(shù)中,如果使用文字字符串汁针,則該字符串必須用單引號(hào)括起來术辐。 what參數(shù)也可以使用包含我們所需要字符串值的VARCHAR2變量。實(shí)際的PL/SQL調(diào)用必須用分號(hào)隔開施无。在PL/SQL調(diào)用中如果要嵌入文字字符串辉词,則必須使用兩個(gè)單引號(hào)。

what參數(shù)的長度在Oracle7.3中限制在2000個(gè)字節(jié)以內(nèi)猾骡,在Oracle 8.0以后瑞躺,擴(kuò)大到了4000個(gè)字節(jié)敷搪,這對(duì)于一般的應(yīng)用已完全足夠。該參數(shù)的值一般情況下都是對(duì)一個(gè)PL/SQL存儲(chǔ)過程的調(diào)用幢哨。在實(shí)際應(yīng)用中赡勘,盡管可以使用大匿名Pl/SQL塊,但建議大家最好不要這樣使用捞镰。還有一個(gè)實(shí)際經(jīng)驗(yàn)就是最好將存儲(chǔ)過程調(diào)用封裝在一個(gè)匿名塊中狮含,這樣可以避免一些比較莫名錯(cuò)誤的產(chǎn)生猴抹。我來舉一個(gè)例子萤晴,一般情況下,what參數(shù)可以這樣引用:

what =>’my_procedure(parameter1);’

但是比較安全的引用青柄,應(yīng)該這樣寫:

what =>’begin my_procedure(parameter1); end;’

任何時(shí)候冰评,我們只要通過更改what參數(shù)就可以達(dá)到更改任務(wù)定義的目的映胁。但是有一點(diǎn)需要注意,通過改變what參數(shù)來改變?nèi)蝿?wù)定義時(shí)甲雅,用戶當(dāng)前的會(huì)話設(shè)置也被記錄下來并成為任務(wù)運(yùn)行環(huán)境的一部分解孙。如果當(dāng)前會(huì)話設(shè)置和最初提交任務(wù)時(shí)的會(huì)話設(shè)置不同,就有可能改變?nèi)蝿?wù)的運(yùn)行行為抛人。意識(shí)到這個(gè)潛在的副作用是非常重要的弛姜,無論何時(shí)只要應(yīng)用到任何DBMS_JOB過程中的what參數(shù)時(shí)就一定要確保會(huì)話設(shè)置的正確。

3妖枚、next_date

Next_date參數(shù)是用來調(diào)度任務(wù)隊(duì)列中該任務(wù)下一次運(yùn)行的時(shí)間廷臼。這個(gè)參數(shù)對(duì)于DBMS_JOB.SUBMIT和DBMS_JOB.BROKEN這兩個(gè)過程確省為系統(tǒng)當(dāng)前時(shí)間,也就是說任務(wù)將立即運(yùn)行绝页。

當(dāng)將一個(gè)任務(wù)的next_date參數(shù)賦值為null時(shí)荠商,則該任務(wù)下一次運(yùn)行的時(shí)間將被指定為4000年1月1日,也就是說該任務(wù)將永遠(yuǎn)不再運(yùn)行续誉。在大多數(shù)情況下莱没,這可能是我們不愿意看到的情形。但是酷鸦,換一個(gè)角度來考慮饰躲,如果想在任務(wù)隊(duì)列中保留該任務(wù)而又不想讓其運(yùn)行,將next_date設(shè)置為null卻是一個(gè)非常簡單的辦法臼隔。

Next_date也可以設(shè)置為過去的一個(gè)時(shí)間嘹裂。這里要注意,系統(tǒng)任務(wù)的執(zhí)行順序是根據(jù)它們下一次的執(zhí)行時(shí)間來確定的躬翁,于是將next_date參數(shù)設(shè)置回去就可以達(dá)到將該任務(wù)排在任務(wù)隊(duì)列前面的目的焦蘑。這在任務(wù)隊(duì)列進(jìn)程不能跟上將要執(zhí)行的任務(wù)并且一個(gè)特定的任務(wù)需要盡快執(zhí)行時(shí)是非常有用的。

4盒发、Interval

Internal參數(shù)是一個(gè)表示Oracle合法日期表達(dá)式的字符串例嘱。這個(gè)日期字符串的值在每次任務(wù)被執(zhí)行時(shí)算出狡逢,算出的日期表達(dá)式有兩種可能,要么是未來的一個(gè)時(shí)間要么就是null拼卵。這里要強(qiáng)調(diào)一點(diǎn):很多開發(fā)者都沒有意識(shí)到next_date是在一個(gè)任務(wù)開始時(shí)算出的奢浑,而不是在任務(wù)成功完成時(shí)算出的。

當(dāng)任務(wù)成功完成時(shí)腋腮,系統(tǒng)通過更新任務(wù)隊(duì)列目錄表將前面算出的next_date值置為下一次任務(wù)要運(yùn)行的時(shí)間雀彼。當(dāng)由interval表達(dá)式算出next_date是null時(shí),任務(wù)自動(dòng)從任務(wù)隊(duì)列中移出即寡,不會(huì)再繼續(xù)執(zhí)行徊哑。因此,如果傳遞一個(gè)null值給interval參數(shù)聪富,則該任務(wù)僅僅執(zhí)行一次莺丑。

通過給interval參數(shù)賦各種不同的值,可以設(shè)計(jì)出復(fù)雜運(yùn)行時(shí)間計(jì)劃的任務(wù)墩蔓。本文后面的“任務(wù)間隔和日期算法”將對(duì)interval表達(dá)式進(jìn)行詳細(xì)討論梢莽,并給出一個(gè)實(shí)際有用interval表達(dá)式的例子。

描述 Interval參數(shù)值
每天運(yùn)行一次 'SYSDATE + 1'
每小時(shí)運(yùn)行一次 'SYSDATE + 1/24'
每10分鐘運(yùn)行一次 'SYSDATE + 10/(60*24)'
每30秒運(yùn)行一次 'SYSDATE + 30/(602460)'
每隔一星期運(yùn)行一次 'SYSDATE + 7'
不再運(yùn)行該任務(wù)并刪除它 NULL
每天午夜12點(diǎn) 'TRUNC(SYSDATE + 1)'
每天早上8點(diǎn)30分 'TRUNC(SYSDATE + 1) + (860+30)/(2460)'
每星期二中午12點(diǎn) 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每個(gè)月第一天的午夜12點(diǎn) 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每個(gè)季度最后一天的晚上11點(diǎn) 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點(diǎn)10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

實(shí)例:

-- 創(chuàng)建測試表
create table test(id number(5),name varchar2(20),age number(3);

-- 創(chuàng)建測試存儲(chǔ)過程
create or replace procedure p_test_job
as
begin
  insert into test(id,name,age) values(1,'haha',9);
  commit;
end p_test_job;

-- 創(chuàng)建job任務(wù)
declare
    v_count number;
    v_jobnum number := 400;
begin
    select count(*) into v_count from USER_JOBS t
        where upper(t.WHAT) = upper('p_test_job;')
           and upper(t.SCHEMA_USER) = upper('PCTIIVR'); 
    
    if(v_count = 0) then
        dbms_job.submit(JOB        => v_jobnum,
                        WHAT       => upper('p_test_job;'),-- 此處存儲(chǔ)過程結(jié)尾必須以;號(hào)結(jié)束
                        NEXT_DATE  => trunc(sysdate + 1,'DD'),
                        INTERVAL   => 'trunc(sysdate + 1,''DD'')'-- 注意此處的格式與上一行的格式不一樣
        );
        commit;
     else
        select t.job into v_jobnum from USER_JOBS t
           where upper(t.WHAT) = upper('p_test_job;')
              and upper(t.SCHEMA_USER) = upper('PCTIIVR');
       
        dbms_job.change(JOB        => v_jobnum,
                        WHAT       => upper('p_test_job;'),
                        NEXT_DATE  => trunc(sysdate + 1,'DD'),
                        INTERVAL   => 'trunc(sysdate + 1,''DD'')'
        );
        commit;
     end if;
     -- 執(zhí)行任務(wù)  必須保證查出來的是唯一值奸披,如果不是唯一值就會(huì)出錯(cuò)昏名,所以最好查來確定后再run
    -- select job into v_jobnum from user_jobs t where upper(t.what) = upper('p_test_job;');
     -- dbms_job.run(v_jobnum);
end;
/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阵面,隨后出現(xiàn)的幾起案子轻局,更是在濱河造成了極大的恐慌,老刑警劉巖膜钓,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗽交,死亡現(xiàn)場離奇詭異,居然都是意外死亡颂斜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門拾枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沃疮,“玉大人,你說我怎么就攤上這事梅肤∷臼撸” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵姨蝴,是天一觀的道長俊啼。 經(jīng)常有香客問我,道長左医,這世上最難降的妖魔是什么授帕? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任同木,我火速辦了婚禮,結(jié)果婚禮上跛十,老公的妹妹穿的比我還像新娘彤路。我一直安慰自己,他們只是感情好芥映,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布洲尊。 她就那樣靜靜地躺著,像睡著了一般奈偏。 火紅的嫁衣襯著肌膚如雪坞嘀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天惊来,我揣著相機(jī)與錄音丽涩,去河邊找鬼。 笑死唁盏,一個(gè)胖子當(dāng)著我的面吹牛内狸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厘擂,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼昆淡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刽严?” 一聲冷哼從身側(cè)響起昂灵,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舞萄,沒想到半個(gè)月后眨补,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倒脓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年撑螺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崎弃。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘晤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲做,到底是詐尸還是另有隱情线婚,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布盆均,位于F島的核電站塞弊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜游沿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一饰抒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奏候,春花似錦循集、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咒精,卻和暖如春镶柱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背模叙。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工歇拆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人范咨。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓故觅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渠啊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子输吏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容