(轉)Oracle定時執行計劃任務

Oracle定時執行計劃任務

 

 
平常工做中,每每有些事情是須要常常重複地作的,例如天天更新業務報表、天天從數據庫中提取符合條件的數據、天天將客戶關係管理系統中的數據分配給員工作數據庫營銷……所以咱們就想:能不能讓系統來自動定時執行計劃任務?下面介紹的是在Oracle數據庫中如何實現定時執行計劃任務。
Oracle在10g版本之前,計劃任務用的是DBMS_JOB包,10g版本引入DBMS_SCHEDULER來替代先前的DBMS_JOB,在功能方面,它比DBMS_JOB提供了更強大的功能和更靈活的機制/管理,但DBMS_JOB包的使用相對比較簡單,也基本可以知足定時執行計劃任務的需求,故接下來就先看看DBMS_JOB包的使用方法。咱們能夠在命令窗口輸入show parameter job_queue_processes查看數據庫中定時任務的最多併發數,通常設置爲10(設置方法:alter system set job_queue_processes=10),若是設爲0,那麼數據庫定時做業是不會運行的。
Oracle定時執行計劃任務
接下來咱們嘗試實現如下功能:每隔一分鐘自動向job_test表中插入當前的系統時間。
一、創測試表
create table job_test(updatetime date);
二、建立JOB
variable v_job_no number;
begin
dbms_job.submit(:v_job_no, 'insert into job_test values(sysdate);', sysdate, 'sysdate+1/1440');
end;
/
其中最後一個參數'sysdate+1/1440'表示時間間隔爲每分鐘。其它經常使用的時間間隔的設置以下:
(1)若是想天天凌晨1點執行,則此參數可設置爲'trunc(sysdate)+25/24';
(2)若是想每週一凌晨1點執行,則此參數可設置爲'trunc(next_day(sysdate,1))+25/24';
(3)若是想每個月1號凌晨1點執行,則此參數可設置爲'trunc(last_day(sysdate))+25/24';
(4)若是想每季度執行一次,則此參數可設置爲'trunc(add_months(sysdate,3),'Q')+1/24';
(5)若是想每半年執行一次,則此參數可設置爲'add_months(trunc(sysdate,'yyyy'),6)+1/24';
(6)若是想每一年執行一次,則此參數可設置爲'add_months(trunc(sysdate,'yyyy'),12)+1/24'。
 
DBMS_SCHEDULER的功能更強大,定義更靈活,加強了與系統的交互性。舉例以下:
 
begin 
       dbms_scheduler.create_job (
       job_name => '測試',
       job_type => 'PLSQL_BLOCK',
       job_action => 'insert into job_test values(sysdate);',
       start_date => sysdate,
       end_date => add_months(sysdate,12000),
       repeat_interval => 'FREQ=MINUTELY; INTERVAL=1',
       enabled => true,
       comments => '定時執行計劃任務'
       );
end;
 
以上代碼能夠經過在PLSQL Developer中新建Jobs輕鬆設定:
以上是本人以本身的實際狀況配置的調用的是存儲過程、使用的是一年中的每月的1四、15號23:23:59秒執行
參數含義以下:
•JOB_NAME :指定任務的名稱,必選值,注意要確保指定的名稱惟一。
•JOB_TYPE :任務執行的操做類型,必選值,有下列幾個可選值:
  ◦PLSQL_BLOCK :表示任務執行的是一個PL/SQL匿名塊。
  ◦STORED_PROCEDURE :表示任務執行的是ORACLE過程(含PL/SQL PROCEDURE和JAVA PROCEDURE)。
  ◦EXECUTABLE :表示任務執行的是一個外部程序,好比說操做系統命令。
  ◦CHAIN :表示任務執行的是一個CHAIN。
•JOB_ACTION :任務執行的操做,必選值,應與JOB_TYPE類型中指定的參數相匹配。好比說對於PL/SQL匿名塊,此處就能夠放置PL/SQL塊的具體表明,相似DECLARE .. BEGIN ..END這類;若是是ORACLE過程,那麼此處應該指定具體的過程名,注意因爲任務執行,即便過程當中有OUT之類參數,實際執行時也不會有輸出的。
•START_DATE :指定任務初次執行的時間,本參數可爲空,當爲空時,表示任務馬上執行,效果等同於指定該參數值爲SYSDATE。
•REPEAT_INTERVAL :指定任務執行的頻率,好比多長時間會被觸發再次執行。本參數也能夠爲空,若是爲空的話,就表示當前設定的任務只執行一次。REPEAT_INTERVAL參數須要好好說說,REPEAT_INTERVAL參數的語法結構要複雜的多。其中最重要的是FREQ和INTERVAL兩個關鍵字。
  ◦FREQ 關鍵字用來指定間隔的時間週期,可選參數有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY,分別表示年、月、周、日、時、分、秒等單位。
  ◦INTERVAL 關鍵字用來指定間隔的頻繁,可指定的值的範圍從1-99。
例如:REPEAT_INTERVAL=>'FREQ=DAILY;INTERVAL=1';表示天天執行一次,若是將INTERVAL改成7就表示每7天執行一次,效果等同於FREQ=WEEKLY;INTERVAL=1。
通常來講,使用DBMS_SCHEDULER.CREATE_JOB建立一個JOB,至少須要指定上述參數中的前3項。除此以外,還能夠在CREATE_JOB時,指定下列參數:
•NUMBER_OF_ARGUMENTS :指定該JOB執行時須要附帶的參數的數量,默認值爲0,注意當JOB_TYPE列值爲PLSQL_BLOCK或CHAIN時,本參數必須設置爲0,由於上述兩種狀況下不支持附帶參數。
•END_DATE :指定任務的過時時間,默認值爲NULL。任務過時後,任務的STATE將自動被修改成COMPLETED,ENABLED被置爲FALSE。若是該參數設置爲空的話,表示該任務永不過時,將一直按照REPEAT_INTERVAL參數設置的週期重複執行,直到達到設置的MAX_RUNS或MAX_FAILURES值。
•JOB_CLASS :指定任務關聯的CLASS,默認值爲DEFAULT_JOB_CLASS。
•ENABLED :指定任務是否啓用,默認值爲FALSE。FALSE狀態表示該任務並不會被執行,除非被用戶手動調用,或者用戶將該任務的狀態修改成TRUE。
•AUTO_DROP :當該標誌被置爲TRUE時,ORACLE會在知足條件時自動刪除建立的任務
  ◦任務已過時;
  ◦任務最大運行次數已達MAX_RUNS的設置值;
  ◦任務未指定REPEAT_INTERVAL參數,僅運行一次;
•COMMENTS :設置任務的註釋信息,默認值爲NULL。
 
還有一些的功能和參數沒有作詳細說明,可參考:
二、 DBMS_SCHEDULER 帶參數JOB
 

歡迎評論和轉載,轉載請註明來源於@數據化分析 的博客:http://blog.sina.com.cn/data2analysis,除非特別聲明,本站採用許可:署名,非商業。多謝支持!html

相關文章
相關標籤/搜索