天天看點

定時任務

一種是: 作業系統的定時,win的定時任務,unix的crontab

一種是: 資料庫級的定時,她的效率更高,

再有大量的表級操作時,建議用資料庫本身的job queue,這樣友善,效率高;如果用系統級定時,

會增加很多程式設計工作,成本增加了,還很容易出錯,事情越簡單出錯的幾率越小.

再使用job queue之前,我們還要簡單配置下,oracle定時執行job queue 的背景程序是snp,要啟動

snp,首先看系統模式是否支援

sql> alter system enable restricted session;或sql> alter system disable restricted session;

利用上面的指令更改系統的會話方式為disenable restricted,為snp的啟動建立條件.

再有就是配置job queue的啟動參數,snp的啟動參數位于oracle的初始化檔案中,

job_queue_processes=10 (oracle10gde 預設值)

job_queue_interval=n

第一行定義snp程序的啟動個數為10,正常得女冠一範圍是0-36,根據任務的多少,可以配置

不同的數值.

第二行定義系統每隔幾秒喚醒該程序一次.預設是60,正常範圍是1-3600秒.事實上,該程序執行完

目前任務後,就進入睡眠狀态,睡眠一段時間後,由系統的總控負責将其喚醒。

如果該檔案中沒有上面兩行,請按照如上配置添加。配置完成後,需要重新啟動資料庫,使其生效

。注意:如果任務要求執行的間隔很短的話,n的配置也要相應地小一點。

檢視job queue的詳細資訊,查詢資料庫字典 user_jobs

eg:

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

包含以下子過程:

broken()過程。

change()過程。

interval()過程。

isubmit()過程。

next_date()過程。

remove()過程。

run()過程。

submit()過程。

user_export()過程。

what()過程。

1、

broken()過程更新一個已送出的工作的狀态,典型地是用來把一個已破工作标記為未破工作。

這個過程有三個參數:job 、broken與next_date。

procedure broken (job in binary_integer,

 broken in boolean,

 next_date in date :=sysdate)

job參數是工作号,它在問題中唯一辨別工作。

broken參數訓示此工作是否将标記為破——true說明此工作将标記為破,而flase說明此工作将标記為未破。

next_date參數訓示在什麼時候此工作将再次運作。此參數預設值為目前日期和時間。

2、

change()過程用來改變指定工作的設定。

這個過程有四個參數:job、what 、next_date與interval。

procedure change (job in binary_integer,

 what in varchar2,

 next_date in date,

 interval in varchar2)

此job參數是一個整數值,它唯一辨別此工作。

what參數是由此工作運作的一塊pl/sql代碼塊。

next_date參數訓示何時此工作将被執行。

interval參數訓示一個工作重執行的頻度。

3、

interval()過程用來顯式地設定重執行一個工作之間的時間間隔數。

這個過程有兩個參數:job與interval。

procedure interval (job in binary_integer,

job參數辨別一個特定的工作。interval參數訓示一個工作重執行的頻度。

4、

isubmit()過程用來用特定的工作号送出一個工作。

這個過程有五個參數:job、what、next_date、interval與no_parse。

procedure isubmit (job in binary_ineger,

 interval in varchar2,

 no_parse in booean:=false)

這個過程與submit()過程的唯一差別在于此job參數作為in型參數傳遞且包括一個

由開發者提供的工作号。如果提供的工作号已被使用,将産生一個錯誤。

5、

next_date()過程用來顯式地設定一個工作的執行時間。這個過程接收兩個參數:job與next_date。

procedure next_date(job in binary_ineger,

 next_date in date)

job辨別一個已存在的工作。next_date參數訓示了此工作應被執行的日期與時間。

6、

remove()過程來删除一個已計劃運作的工作。這個過程接收一個參數:

procedure remove(job in binary_ineger);

job參數唯一地辨別一個工作。這個參數的值是由為此工作調用submit()過程傳回的job參數的值。

已正在運作的工作不能由調用過程式删除。

7、

run()過程用來立即執行一個指定的工作。這個過程隻接收一個參數:

procedure run(job in binary_ineger)

job參數辨別将被立即執行的工作。

8、

使用submit()過程,工作被正常地計劃好。

procedure submit ( job out binary_ineger,

job參數是由submit()過程傳回的binary_ineger。這個值用來唯一辨別一個工作。

what參數是将被執行的pl/sql代碼塊。

next_date參數指識何時将運作這個工作。

interval參數何時這個工作将被重執行。

no_parse參數訓示此工作在送出時或執行時是否應進行文法分析——true

訓示此pl/sql代碼在它第一次執行時應進行文法分析,

而false訓示本pl/sql代碼應立即進行文法分析。

9、

user_export()過程傳回一個指令,此指令用來安排一個存在的工作以便此工作能重新送出。

此程式有兩個參數:job與my_call。

procedure user_export(job in binary_ineger,

 my_call in out varchar2)

job參數辨別一個安排了的工作。my_call參數包含在它的目前狀态重新送出此工作所需要

的正文。

10、

what()過程應許在工作執行時重新設定此正在運作的指令。這個過程接收兩個參數:job與what。

procedure what (job in binary_ineger,

 what in out varchar2)

job參數辨別一個存在的工作。what參數訓示将被執行的新的pl/sql代碼。

一個簡單例子:

建立測試表

sql> create table a(a date);

表已建立。

建立一個自定義過程

sql> create or replace procedure test as

 2 begin

 3 insert into a values(sysdate);

 4 end;

 5 /

過程已建立。

建立job

sql> variable job1 number;

sql>

sql> begin

 2 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  --每天1440分鐘,即一分鐘運作test過程一次

 3 end;

 4 /

pl/sql 過程已成功完成。

運作job

 2 dbms_job.run(:job1);

sql> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 時間 from a;

時間

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

2001/01/07 23:51:21

2001/01/07 23:52:22

2001/01/07 23:53:24

删除job

 2 dbms_job.remove(:job1);

後續……………………………………