oracle 定時 作業 例子

2021-08-25 00:01:35 字數 3441 閱讀 9392

sql

>

variablejobno

number

;sql

>

begin

sql>

dbms_job.submit(:jobno,

'pro_name();

',sysdate,

'sysdate+1');

dbms_job.submit(:job1,

'myproc;

',sysdate,

'sysdate+1/1440

');  

--每天1440分鐘,即一分鐘執行test過程一次

sql>

commit

;sql

>

end;

------------------------------------

在命令控制台中這樣就可以建產乙個作業了。sysdate表示當前作業將來執行的時間,sysdate+1表示呼叫頻率。

描述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)'

select * from user_jobs

查詢作業記錄

1.確保oracle的工作模式允許啟動任務佇列管理器

oracle定時執行「job queue」的後台程式是snp程序,而要啟動snp程序,首先要確保整個系統的模式是可以啟動snp程序的,這需要以dba的身份去執行如下命令:

svrmgrl>; alter system enable restricted session;

或sql>; alter system disenable restricted session;

利用如上命令更改系統的會話方式為disenable restricted,為snp的啟動創造條件。

2.確保oracle的系統已經配置了任務佇列管理器的啟動引數

snp的啟動引數位於oracle的初始化檔案中,該檔案放在$oracle_home/dbs路徑下,如果oracle的sid是myora8的話,則初始化檔案就是initmyora8.ora,在檔案中對snp啟動引數的描述部分如下:

job_queue_process=n

job_queue_interval=n

第一行定義snp程序的啟動個數為n。系統預設值為0,正常定義範圍為0~36,根據任務的多少,可以配置不同的數值。

第二行定義系統每隔n秒喚醒該程序一次。系統預設值為60秒,正常範圍為1~3600秒。事實上,該程序執行完當前任務後,就進入睡眠狀態,睡眠一段時間後,由系統的總控負責將其喚醒。

如果該檔案中沒有上面兩行,請按照如上配置新增。配置完成後,需要重新啟動資料庫,使其生效。注意:如果任務要求執行的間隔很短的話,n的配置也要相應地小一點。

3.將任務加入到資料庫的任務佇列中

呼叫oracle的dbms_job包中的儲存過程,將任務加入到任務佇列中:

dbms_job.submit( job out binary_integer,

what       in   archar2,

next_date     in   date,

interval     in   varchar2,

no_parse     in   boolean)

其中:

●job:輸出變數,是此任務在任務佇列中的編號;

●what:執行的任務的名稱及其輸入引數;

●next_date:任務執行的時間;

●interval:任務執行的時間間隔。

下面詳細討論一下dbms_job.submit中的引數interval。嚴格地講,interval是指上一次執行結束到下一次開始執行的時間間隔,當interval設定為null時,該job執行結束後,就被從佇列中刪除。假如我們需要該job周期性地執行,則要用『sysdate+m』表示。

將任務加入到任務佇列之前,要確定執行任務的資料庫使用者,若使用者是scott, 則需要確保該使用者擁有執行包dbms_job的許可權;若沒有,需要以dba的身份將權利授予scott使用者:

svrmgrl>; grant execute on dbms_job to scott;

4.將要執行的任務寫成儲存過程或其他的資料庫可執行的pl/sql程式段

例如,我們已經建立了乙個儲存過程,其名稱為my_job,在sql/plus中以scott使用者身份登入,執行如下命令:

sql>; variable n number;

sql>; begin

dbms_job.submit(:n『my_job;』,sysdate,

『sysdate+1/360』);

commit;

end;

/ 系統提示執行成功。

sql>; print :n;

系統列印此任務的編號,例如結果為300。

如上,我們建立了乙個每隔4分鐘執行一次的任務號為300的任務。可以通過oracle提供的資料字典user_jobs察看該任務的執**況:

sql>; select job,next_date,next_sec,failures,broken from user_jobs;

執行結果如下:

job next_date next_sec failures broken

300 2000/10/10 11:45:15 0 n

這表示任務號為300的任務,下一次將在2000/10/10 11:45:15執行,此任務的執行失敗記錄為0次。注意:當執行job出現錯誤時,oracle將其記錄在日誌裡,失敗次數每次自動加1。當執行失敗次數達到16時,oracle就將該job標誌為broken。此後,oracle不再繼續執行它,直到使用者呼叫過程dbms_job.broken,重新設定為not broken,或強制呼叫dbms_job.run來重新執行它。

除了以上我們討論的submit儲存過程之外,oracle還提供了其他許多儲存過程來操作任務。例如:dbms_job.change 、 dbms_job.what、dbms_job.interval可以用來修改提交的任務。要想刪除該任務,只需執行dbms_job.remove(n)即可,其中n為任務號。

ORACLE 建立作業JOB例子

1.plsql中學習job 學習job 建表 create table test job para date date commit insert into test job values sysdate commit select from test job 建立存貯過程 create or re...

ORACLE 建立作業JOB例子

1.plsql中學習job 學習job 建表 create table test job para date date commit insert into test job values sysdate commit select from test job 建立存貯過程 create orrep...

ORACLE 建立作業JOB例子

1.plsql中學習job 學習job 建表 create table test job para date date commit insert into test job values sysdate commit select from test job 建立存貯過程 create or re...