溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle job定時(shí)任務(wù)怎么理解

發(fā)布時(shí)間:2021-12-22 09:30:09 來源:億速云 閱讀:137 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要介紹“Oracle job定時(shí)任務(wù)怎么理解”,在日常操作中,相信很多人在Oracle job定時(shí)任務(wù)怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”O(jiān)racle job定時(shí)任務(wù)怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

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

任務(wù)隊(duì)列要能正常運(yùn)行,還必須啟動(dòng)它自己專有的后臺過程,參數(shù)如下:
JOB_QUEUE_PROCESSES = n

這個(gè)是運(yùn)行JOB時(shí)候所起的進(jìn)程數(shù),當(dāng)然系統(tǒng)里面JOB大于這個(gè)數(shù)值后,就會(huì)有排隊(duì)等候的,最小值是0,表示不運(yùn)行JOB,最大值是1000,在OS上對應(yīng)的進(jìn)程時(shí)SNPn,9i以后OS上管理JOB的進(jìn)程叫CJQn。
可以使用下面這個(gè)SQL確定目前有幾個(gè)SNP/CJQ在運(yùn)行。
SQL> set lines 200
SQL> select * from v$bgprocess where name like 'CJQ%';

PADDR              PSERIAL# NAME  DESCRIPTION                                                           ERROR
---------------- ---------- ----- ---------------------------------------------------------------- ----------
C0000005F4610F38          1 CJQ0  Job Queue Coordinator                                            ##########

這個(gè)paddr不為空的snp/cjq進(jìn)程就是目前空閑的進(jìn)程,有的表示正在工作的進(jìn)程。
 
三、DBMS_JOB包參數(shù)
DBMS_JOB包中所有的過程都有一組相同的公共參數(shù),用于定義任務(wù),任務(wù)的運(yùn)行時(shí)間以及任務(wù)定時(shí)運(yùn)行的時(shí)間間隔。這些公共任務(wù)定義參數(shù)見表2所示。
 
下面我們來詳細(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ù)號。該任務(wù)號是作為一個(gè)OUT參數(shù)返回的,所以調(diào)用者隨后可以識別出提交的任務(wù)。而DBMS_JOB.ISUBMIT過程則由調(diào)用者給任務(wù)指定一個(gè)識別號,這時(shí)候,任務(wù)號的唯一性就完全取決于調(diào)用者了。

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

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

what參數(shù)的長度在Oracle7.3中限制在2000個(gè)字節(jié)以內(nèi),在Oracle 8.0以后,擴(kuò)大到了4000個(gè)字節(jié),這對于一般的應(yīng)用已完全足夠。該參數(shù)的值一般情況下都是對一個(gè)PL/SQL存儲過程的調(diào)用。在實(shí)際應(yīng)用中,盡管可以使用大匿名Pl/SQL塊,但建議大家最好不要這樣使用。還有一個(gè)實(shí)際經(jīng)驗(yàn)就是最好將存儲過程調(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)行行為。意識到這個(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ù)對于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ā)者都沒有意識到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ù)間隔和日期算法”將對interval表達(dá)式進(jìn)行詳細(xì)討論,并給出一個(gè)實(shí)際有用interval表達(dá)式的例子。

四、任務(wù)隊(duì)列架構(gòu)和運(yùn)行環(huán)境

當(dāng)CJQn進(jìn)程喚醒時(shí),它首先查看任務(wù)隊(duì)列目錄中所有的任務(wù)是否當(dāng)前的時(shí)間超過了下一次運(yùn)行的日期時(shí)間。CJQn進(jìn)程檢測到需要該時(shí)間立即執(zhí)行的任務(wù)后,這些任務(wù)按照下一次執(zhí)行日期的順序依次執(zhí)行。當(dāng)CJQn進(jìn)程開始執(zhí)行一個(gè)任務(wù)時(shí),其過程如下:
1.以任務(wù)所有者的用戶名開始一個(gè)新的數(shù)據(jù)庫會(huì)話。
2.當(dāng)任務(wù)第一次提交或是最后一次被修改時(shí),更改會(huì)話NLS設(shè)置和目前就緒的任務(wù)相匹配。
3.通過interval日期表達(dá)式和系統(tǒng)時(shí)間,計(jì)算下一次執(zhí)行時(shí)間。
4.執(zhí)行任務(wù)定義的PL/SQL
5.如果運(yùn)行成功,任務(wù)的下一次執(zhí)行日期(next_date)被更新,否則,失敗計(jì)數(shù)加1。
6.經(jīng)過JOB_QUEUS_INTERVAL秒后,又到了另一個(gè)任務(wù)的運(yùn)行時(shí)間,重復(fù)上面的過程。

在前兩步中,CJQn進(jìn)程創(chuàng)建了一個(gè)模仿用戶運(yùn)行任務(wù)定義的PL/SQL的會(huì)話環(huán)境。然而,這個(gè)模仿的運(yùn)行環(huán)境并不是和用戶實(shí)際會(huì)話環(huán)境完全一樣,需要注意以下兩點(diǎn):
第一,在任務(wù)提交時(shí)任何可用的非確省角色都將在任務(wù)運(yùn)行環(huán)境中不可用。因此,那些想從非確省角色中取得權(quán)限的任務(wù)不能提交,用戶確省角色的修改可以通過在任務(wù)未來運(yùn)行期間動(dòng)態(tài)修改來完成。
第二,任何任務(wù)定義本身或者過程執(zhí)行中需要的數(shù)據(jù)庫聯(lián)接都必須完全滿足遠(yuǎn)程的用戶名和密碼。CJQn進(jìn)程不能在沒有顯式指明口令的情況下初始化一個(gè)遠(yuǎn)程會(huì)話。顯然,CJQn進(jìn)程不能假定將本地用戶的口令作為遠(yuǎn)程運(yùn)行環(huán)境會(huì)話設(shè)置的一部分。


當(dāng)任務(wù)運(yùn)行失敗時(shí),CJQn進(jìn)程在1分鐘后將再次試圖運(yùn)行該任務(wù)。如果這次運(yùn)行又失敗了,下一次嘗試將在2分鐘后進(jìn)行,再下一次在4分鐘以后。任務(wù)隊(duì)列每次加倍重試間隔直到它超過了正常的運(yùn)行間隔。在連續(xù)16次失敗后,任務(wù)就被標(biāo)記為中斷的(broken),如果沒有用戶干預(yù),任務(wù)隊(duì)列將不再重復(fù)執(zhí)行。

五、任務(wù)隊(duì)列字典表和視圖
任務(wù)隊(duì)列中的任務(wù)信息可以通過表3所示的幾個(gè)字典視圖來查看,這些視圖是由CATJOBQ.sql腳本創(chuàng)建的。表4和5是各個(gè)視圖每個(gè)字段的含義。

六、任務(wù)重復(fù)運(yùn)行間隔設(shè)計(jì)算法
任務(wù)重復(fù)運(yùn)行的時(shí)間間隔取決于interval參數(shù)中設(shè)置的日期表達(dá)式。下面就來詳細(xì)談?wù)勗撊绾卧O(shè)置interval參數(shù)才能準(zhǔn)確滿足我們的任務(wù)需求。一般來講,對于一個(gè)任務(wù)的定時(shí)執(zhí)行,有三種定時(shí)要求。
1.在一個(gè)特定的時(shí)間間隔后,重復(fù)運(yùn)行該任務(wù)。
2.在特定的日期和時(shí)間運(yùn)行任務(wù)。
3.任務(wù)成功完成后,下一次執(zhí)行應(yīng)該在一個(gè)特定的時(shí)間間隔之后。

第一種調(diào)度任務(wù)需求的日期算法比較簡單,即'SYSDATE+n',這里n是一個(gè)以天為單位的時(shí)間間隔。表6給出了一些這種時(shí)間間隔設(shè)置的例子。

 
表6所示的任務(wù)間隔表達(dá)式不能保證任務(wù)的下一次運(yùn)行時(shí)間在一個(gè)特定的日期或者時(shí)間,僅僅能夠指定一個(gè)任務(wù)兩次運(yùn)行之間的時(shí)間間隔。
例如,如果一個(gè)任務(wù)第一次運(yùn)行是在凌晨12點(diǎn),interval指定為'SYSDATE + 1',則該任務(wù)將被計(jì)劃在第二天的凌晨12點(diǎn)執(zhí)行。但是,如果某用戶在下午4點(diǎn)手工(DBMS_JOB.RUN)執(zhí)行了該任務(wù),那么該任務(wù)將被重新定時(shí)到第二天的下午4點(diǎn)。還有一個(gè)可能的原因是如果數(shù)據(jù)庫關(guān)閉或者說任務(wù)隊(duì)列非常的忙以至于任務(wù)不能在計(jì)劃的那個(gè)時(shí)間點(diǎn)準(zhǔn)時(shí)執(zhí)行。在這種情況下,任務(wù)將試圖盡快運(yùn)行,也就是說只要數(shù)據(jù)庫一打開或者是任務(wù)隊(duì)列不忙就開始執(zhí)行,但是這時(shí),運(yùn)行時(shí)間已經(jīng)從原來的提交時(shí)間漂移到了后來真正的運(yùn)行時(shí)間。這種下一次運(yùn)行時(shí)間的不斷“漂移”是采用簡單時(shí)間間隔表達(dá)式的典型特征。

第二種調(diào)度任務(wù)需求相對于第一種就需要更復(fù)雜的時(shí)間間隔(interval)表達(dá)式,表7是一些要求在特定的時(shí)間運(yùn)行任務(wù)的interval設(shè)置例子。

 
第三種調(diào)度任務(wù)需求無論通過怎樣設(shè)置interval日期表達(dá)式也不能滿足要求。這時(shí)因?yàn)橐粋€(gè)任務(wù)的下一次運(yùn)行時(shí)間在任務(wù)開始時(shí)才計(jì)算,而在此時(shí)是不知道任務(wù)在何時(shí)結(jié)束的。

遇到這種情況怎么辦呢?當(dāng)然辦法肯定是有的,我們可以通過為任務(wù)隊(duì)列寫過程的辦法來實(shí)現(xiàn)。這里我只是簡單介紹以下,可以在前一個(gè)任務(wù)隊(duì)列執(zhí)行的過程中,取得任務(wù)完成的系統(tǒng)時(shí)間,然后加上指定的時(shí)間間隔,拿這個(gè)時(shí)間來控制下一個(gè)要執(zhí)行的任務(wù)。這里有一個(gè)前提條件,就是目前運(yùn)行的任務(wù)本身必須要嚴(yán)格遵守自己的時(shí)間計(jì)劃。

六、 實(shí)驗(yàn)概述

目前,流行的主流數(shù)據(jù)庫都擁有此項(xiàng)功能,最具代表性的是Microsoft SQL Server 7.0、Oracle8i/9i等。但是,要讓Job工作,還需要我們加以配置才能實(shí)現(xiàn)。這些配置都有GUI操作。本文介紹Oracle9i之后通過命令行實(shí)現(xiàn)Job配置......

眾所周知,一般操作系統(tǒng)會(huì)提供定時(shí)執(zhí)行任務(wù)的方法,例如:Unix平臺上提供了讓系統(tǒng)定時(shí)執(zhí)行任務(wù)的命令Crontab。但是,對于某些需求,例如:一些對數(shù)據(jù)庫表的操作,最為典型的是證券交易所每日收盤后的結(jié)算,它涉及大量的數(shù)據(jù)庫表操作,如果仍然利用操作系統(tǒng)去定時(shí)執(zhí)行,不僅需要大量的編程工作,而且還會(huì)出現(xiàn)用戶不一致等運(yùn)行錯(cuò)誤,甚至導(dǎo)致程序無法執(zhí)行。

事實(shí)上,對于以上需求,我們可以利用數(shù)據(jù)庫本身擁有的功能Job Queue(任務(wù)隊(duì)列管理器)去實(shí)現(xiàn)。Job允許用戶提前調(diào)度和安排某一任務(wù),使其能在指定的時(shí)間點(diǎn)或時(shí)間段內(nèi)自動(dòng)執(zhí)行一次或多次,由于任務(wù)在數(shù)據(jù)庫中被執(zhí)行,所以執(zhí)行效率很高。

Job允許我們定制任務(wù)的執(zhí)行時(shí)間,并提供了靈活的處理方式,還可以通過配置,安排任務(wù)在系統(tǒng)用戶訪問量少的時(shí)段內(nèi)執(zhí)行,極大地提高了工作效率。例如,對于數(shù)據(jù)庫日常的備份、更新、刪除和復(fù)制等耗時(shí)長、重復(fù)性強(qiáng)的工作,以及電信增值短信業(yè)務(wù)中的定時(shí)PUSH,我們就可以利用Job去自動(dòng)執(zhí)行以減少工作量。
       
目前,流行的主流數(shù)據(jù)庫都擁有此項(xiàng)功能,最具代表性的是Microsoft SQL Server 7.0、Oracle8i/9i等。但是,要讓Job工作,還需要我們加以配置才能實(shí)現(xiàn)。這些配置都有GUI操作。本文介紹Oracle9i以后通過命令行實(shí)現(xiàn)Job配置。
前提:寫好的要定時(shí)執(zhí)行的存儲過程[不能帶參數(shù)]。
定義一個(gè)Job,執(zhí)行間隔是需要注意的一件重要的事情。SYSDATE+1/24 是存儲在dba_jobs 視圖中的間隔,它可以產(chǎn)生每小時(shí)一次的快照??梢詫⑦@個(gè)數(shù)據(jù)改變?yōu)椴煌牟蓸訒r(shí)間,在一天中有 24*60 = 1440 分鐘,可以使用這個(gè)數(shù)字調(diào)整執(zhí)行次數(shù)。比方說:我希望在每10分鐘獲取一次快照,應(yīng)該使用下列命令:

execute dbms_job.submit(
    :jobno,                             --作業(yè)編號
    'sp;',                              --執(zhí)行的過程
    trunc(sysdate+10/1440,'MI'),        --下次執(zhí)行時(shí)間
    'trunc(sysdate+10/1440,''MI'')',    --間隔時(shí)間
    true,        --no_parse
    :instno);

1.創(chuàng)建JOB
創(chuàng)建一個(gè)任務(wù),執(zhí)行間隔是每5分鐘。
    Variable v_sn number;

    Begin
        dbms_job.submit(:v_sn,
            'p_push_send;',
            trunc(sysdate+5/1440,'MI'),
            'trunc(sysdate+5/1440,''MI'')');
        commit;
    end;
    /

刪除一個(gè)任務(wù):
execute dbms_job.remove(jobno);

2.查詢?nèi)蝿?wù)語句
涉及兩個(gè)表:dba_jobs及dba_jobs_running
select * from dba_jobs;
select * from dba_jobs_running;

select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)

select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


3.必要的參數(shù)[修改initsid.ora參數(shù)]
job_queue_processes = 4              --可執(zhí)行作業(yè)個(gè)數(shù)
job_queue_interval = 10              --默認(rèn)間隔延遲時(shí)間10s
job_queue_keep_connections=true       --job保持正常連接

修改可執(zhí)行作業(yè)個(gè)數(shù)為20個(gè):
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 2;0

修改取消限制模式:
ALTER SYSTEM DISABLE RESTRICTED SESSION;

4.相關(guān)的幾個(gè)Job操作
刪除job:
exec dbms_job.remove(jobno);

修改要執(zhí)行的操作:
exec dbms_job.what(jobno,what);

修改下次執(zhí)行時(shí)間:
exec dbms_job.next_date(job,next_date);

修改間隔時(shí)間:
exec dbms_job.interval(job,interval);

停止job:
exec dbms.broken(job,broken,nextdate);

啟動(dòng)job:
exec dbms_job.run(jobno);

5. 關(guān)于Job 的延遲
Job都有不同程度的延遲,想完全排除這種誤差最好使用操作系統(tǒng)的定時(shí)器crontab或者at,哈哈,開個(gè)玩笑。
A時(shí)間重疊的問題[網(wǎng)友論]:
比如我有兩個(gè)JOB,都是在凌晨3點(diǎn)運(yùn)行,那么如果其中一個(gè)在3點(diǎn)運(yùn)行,那么另一個(gè)必須等待第一個(gè)JOB完成,然后才能執(zhí)行。特別是有些象sysdate+1/24,這樣每隔一小時(shí)運(yùn)行的JOB就更容易沖突;即使沒有時(shí)間重疊,ORACLE也是按job_queue_internal(通常是1分鐘)的間隔進(jìn)行檢查JOB隊(duì)列,這樣1點(diǎn)鐘的作業(yè)正好在3:00:45才檢查到,那么就會(huì)在3:00:45才執(zhí)行該job.我們知道ORACLE JOB如果第一次執(zhí)行失敗,那么按一定的時(shí)間間隔再次啟動(dòng)該JOB直到成功,如果直到運(yùn)行16次還是失敗,那么就中斷該JOB,所以實(shí)際運(yùn)行的時(shí)間會(huì)進(jìn)行推遲。

B采用"精確定時(shí)"函數(shù)(從前面可能看到,其實(shí)是很難實(shí)現(xiàn)精確定時(shí)執(zhí)行JOB的)
我們可以采用如trunc(sysdate)+(1+24)/25或trunc(sysdate)+25/24。表示每天1點(diǎn)執(zhí)行job,這樣就不會(huì)受上次JOB延時(shí)的影響。(沒測過)。
 
 
6. 一個(gè)簡單例子:

6.1 創(chuàng)建測試表
SQL> create table T(a date);
表已創(chuàng)建。

6.2 創(chuàng)建一個(gè)自定義過程
SQL> create or replace procedure MYPROC as
     begin
     insert into T values(sysdate);
     end;
     /
過程已創(chuàng)建。

6.3 創(chuàng)建JOB
SQL> variable job1 number;
SQL> begin
     dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分鐘,即一分鐘運(yùn)行test過程一次
     end;
     /

PL/SQL 過程已成功完成。

SQL> print  job1;

      JOB1
----------
         3

6.4 運(yùn)行JOB
SQL> begin
    dbms_job.run(:job1);
    end;
    /

PL/SQL 過程已成功完成。
SQL>

----驗(yàn)證
SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14

SQL> alter session set nls_date_format='yyyy-mm-dd hh34:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
2017-11-09 14:56:05

SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14
2017/11/09 14:55:14

SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14
2017/11/09 14:55:14
2017/11/09 14:56:14

SQL>

6.5 刪除JOB
SQL> begin
     dbms_job.remove(:job1);
     end;
     /

PL/SQL 過程已成功完成。

6.6 創(chuàng)建DBMS_JOB.submit注意點(diǎn):
為什么剛剛創(chuàng)建后的JOB不能自動(dòng)的執(zhí)行呢?這是一個(gè)疏忽導(dǎo)致的!
在創(chuàng)建JOB的時(shí)候,需要在結(jié)尾處指定“COMMIT;”!表示創(chuàng)建完成之后便執(zhí)行一次。

--刪除之前的JOB,重新創(chuàng)建一個(gè)帶有“COMMIT”語句的新JOB。
SQL> variable job1 number;
SQL> begin
     dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');
     commit;
     end;
     /

PL/SQL procedure successfully completed.

SQL>

SQL> print job1;

      JOB1
----------
         4

此次創(chuàng)建的JOB信息如下,可見LAST_DATE在創(chuàng)建完之后便有內(nèi)容,表示已經(jīng)被執(zhí)行了一次。
SQL> col log_user for a10
SQL> col INTERVAL for a30
SQL> col what for a30
SQL> select job,log_user,to_char(last_date,'yyyy-mm-dd hh34:mi:ss') last_date,to_char(next_date,'yyyy-mm-dd hh34:mi:ss') next_date,interval, what from user_jobs;

       JOB LOG_USER   LAST_DATE           NEXT_DATE           INTERVAL                       WHAT
---------- ---------- ------------------- ------------------- ------------------------------ ------------------------------
         4 SYS        2017-11-09 15:02:34 2017-11-09 15:03:34 sysdate+1/1440                 MYPROC;

SQL>
SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14
2017/11/09 14:55:14
2017/11/09 14:56:14
2017/11/09 14:57:14
2017/11/09 14:58:14
2017/11/09 14:59:14
2017/11/09 15:00:32
2017/11/09 15:00:34
2017/11/09 15:01:34
2017/11/09 15:02:34

10 rows selected.



6.7 再次運(yùn)行之前的未加commit的dbms_job.SUBMIT包
先刪除:
SQL> begin
     dbms_job.remove(:job1);
     end;
     /

PL/SQL procedure successfully completed.

SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14
2017/11/09 14:55:14
2017/11/09 14:56:14
2017/11/09 14:57:14
2017/11/09 14:58:14
2017/11/09 14:59:14
2017/11/09 15:00:32
2017/11/09 15:00:34
2017/11/09 15:01:34
2017/11/09 15:02:34
2017/11/09 15:03:34

時(shí)間
-------------------
2017/11/09 15:04:34
2017/11/09 15:05:34
2017/11/09 15:06:34
2017/11/09 15:07:34

15 rows selected.

SQL> select job,log_user,to_char(last_date,'yyyy-mm-dd hh34:mi:ss') last_date,to_char(next_date,'yyyy-mm-dd hh34:mi:ss') next_date,interval, what from user_jobs;

no rows selected

--運(yùn)行dbms_job.submit:
SQL> variable job1 number;
SQL> begin
     dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');
     end;
     /

PL/SQL procedure successfully completed.

SQL> print job1;

      JOB1
----------
         5

--查詢user_jobs:
SQL> select job,log_user,to_char(last_date,'yyyy-mm-dd hh34:mi:ss') last_date,to_char(next_date,'yyyy-mm-dd hh34:mi:ss') next_date,interval, what from user_jobs;

       JOB LOG_USER   LAST_DATE           NEXT_DATE           INTERVAL                       WHAT
---------- ---------- ------------------- ------------------- ------------------------------ ------------------------------
         5 SYS                            2017-11-09 15:08:34 sysdate+1/1440                 MYPROC;

SQL>
SQL> select to_char(a,'yyyy/mm/dd hh34:mi:ss') 時(shí)間 from T;

時(shí)間
-------------------
2017/11/09 14:54:14
2017/11/09 14:55:14
2017/11/09 14:56:14
2017/11/09 14:57:14
2017/11/09 14:58:14
2017/11/09 14:59:14
2017/11/09 15:00:32
2017/11/09 15:00:34
2017/11/09 15:01:34
2017/11/09 15:02:34
2017/11/09 15:03:34

時(shí)間
-------------------
2017/11/09 15:04:34
2017/11/09 15:05:34
2017/11/09 15:06:34
2017/11/09 15:07:34

15 rows selected.

SQL> 


注意:此處的LAST_DATE內(nèi)容是空,表示此JOB沒有被執(zhí)行過,因此這個(gè)JOB將永遠(yuǎn)不會(huì)被自動(dòng)的執(zhí)行。

那么,如何才能使它自動(dòng)執(zhí)行起來呢?很簡單,只要我們手動(dòng)將這個(gè)JOB執(zhí)行一下即可。

到此,關(guān)于“Oracle job定時(shí)任務(wù)怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI