一種是: 作業系統的定時,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);
後續……………………………………