| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> oracle >> Oracle 10g DBMS_SCHEDULER的中度解析
 

Oracle 10g DBMS_SCHEDULER的中度解析

2008-08-15 05:14:52  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  這篇論壇文章(賽迪網技術社區)針對DBMS_SCHEDULER的使用方法進行了詳盡的介紹,更多內容請參考下文:

  DBMS_SCHEDULER是Oracle 10G中新增的一個包,與老版本的dbms_job包相比,dbms_scheduler有很多新特性,我將通過一系列的文章來介紹一下如何使用這個包.

  1. 創建job

  job是什麽呢? 簡單的說就是計劃(schedule)加上任務說明. 另外還有一些必須的參數.

  這裏提到的"任務"可以是數據庫內部的存儲過程,匿名的PL/SQL塊,也可以是操作系統級別的腳本.

  可以有兩種方式來定義"計劃":

  1) 使用DBMS_SCHDULER.CREATE_SCHEDULE 定義一個計劃;

  2) 調用DBMS_SCHDULER.CREATE_JOBE過程直接指定 (下面會詳細說明)

  在創建一個計劃時,你至少需要指定下面的屬性,它們是job運行所必須的:

  開始時間 (start_time);

  重複頻率 (repeat_interval);

  結束時間 (end_time)

  另外,對于一個job而言,還有很多的附加參數:

  job_class

  job_priority

  auto_drop

  restartable

  max_runs

  max_failures

  schedule_limit

  logging_level

  下面,我以問答的形式來具體解釋.

  Q1:怎麽從數據庫中查詢job的屬性 ?

  A1: 有兩種方法:

  1) 查詢(DBA|ALL|USER)_SCHEDULER_JOBS 視圖

  (提示: 根據用戶權限的不同,選擇性的查詢 DBA|ALL|USER視圖)

  2) 調用DBMS_SCHEDULER包中的GET_ATTRIBUTE 過程

  Q2: 怎麽設置這些屬性呢?

  A2: 也是有兩種方法

  1) 在創建job時直接指定

  2) 調用DBMS_SCHEDULER包中的SET_ATTRIBUTE 過程

  Q3: "我需要什麽權限才能創建job" ?

  它可以創建屬主爲任何用戶(SYS用戶除外)的job.

  缺省情況下,job會被創建在當前的schema下,並且是沒有激活的; 如果要使job一創建

  就自動激活,需要顯式的設置enabled 屬性爲true, 來看一個例子:

  begin

  dbms_scheduler.create_job

  (

  job_name => 'ARC_MOVE',

  schedule_name => 'EVERY_60_MINS',

  job_type => 'EXECUTABLE',

  job_action => '/home/dbtools/move_arcs.sh',

  enabled => true,

  comments => 'Move Archived Logs to a Different Directory'

  );

  end;

  /

  Q4: 能不能詳細地講述一下上面這個過程用到的各個參數?

  A4:

  job_name: 顧名思義,每個job都必須有一個的名稱

  schedule_name: 如果定義了計劃,在這裏指定計劃的名稱

  job_type: 目前支持三種類型:

  PL/SQL塊: PLSQL_BLOCK,

  存儲過程: STORED_PROCEDURE

  外部程序: EXECUTABLE (外部程序可以是一個shell腳本,也可以是操作系統級別的指令).

  job_action: 根據job_type的不同,job_action有不同的含義.

  如果job_type指定的是存儲過程,就需要指定存儲過程的名字;

  如果job_type指定的是PL/SQL塊,就需要輸入完整的PL/SQL代碼;

  如果job_type指定的外部程序,就需要輸入script的名稱或者操作系統的指令名

  enabled: 上面已經說過了,指定job創建完畢是否自動激活

  comments: 對于job的簡單說明

  2. 指定job的執行頻率

  如果我們創建了一個job,並且希望它按照我們指定的日期和時間來運行,就需要定義job的重複頻度了. 例如每天運行,每周日的22:00運行, 每周一,三,五運行,每年的最後一個星期天運行等等.

  (說明:10G以前的版本,與操作系統的交互方面,實現的不是很好。例如要實現一個定期的rman備份任務,就需要結合OS的命令來實現,在UNIX下可以用crontab實現,在windows下用AT命令來實現)

  10G 在這方面有了很大的增強,因爲創建job時可以直接指定操作系統的命令或者腳本,再合理的定義job的執行頻率,可以很輕松地完成複雜的調度任務.

  10G 支持兩種模式的repeat_interval,一種是PL/SQL表達式,這也是dbms_job包中所使用的,例如SYSDATE+1, SYSDATE + 30/24*60; 另一種就是日曆表達式。

  例如MON表示星期一,SUN表示星期天,DAY表示每天,WEEK表示每周等等. 下面來看幾個使用日曆表達式的例子:

  repeat_interval => 'FREQ=HOURLY; INTERVAL=2'

  每隔2小時運行一次job

  repeat_interval => 'FREQ=DAILY'

  每天運行一次job

  repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"

  每周的1,3,5運行job

  repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'

  每年的3,6,9,12月的30號運行job

  用過crontab的人應該都有種似曾相識的感覺吧,呵呵

  下面再說說使用日曆表達式的規則:

  日曆表達式基本分爲三部分: 第一部分是頻率,也就是"FREQ"這個關鍵字,它是必須指定的; 第二部分是時間間隔,也就是"INTERVAL"這個關鍵字,取值範圍是1-999. 它是可選的參數; 最後一部分是附加的參數,可用于精確地指定日期和時間,它也是可選的參數,例如下面這些值都是合法的:

  BYMONTH,BYWEEKNO,BYYEARDAY,BYMONTHDAY,BYDAY

  BYHOUR,BYMINUTE,BYSECOND

  詳細的參數說明請參考 dbms_scheduler的使用說明.

  既然說到了repeat_interval,你可能要問:"有沒有一種簡便的方法來得出,或者說是評估出job的每次運行時間,以及下一次的運行時間呢?"

  dbms_scheduler包提供了一個過程evaluate_calendar_string,可以很方便地完成這個需求. 來看下面的例子:

  SQL> set serveroutput on size 999999

  SQL> declare

  L_start_date TIMESTAMP;

  l_next_date TIMESTAMP;

  l_return_date TIMESTAMP;

  begin

  l_start_date := trunc(SYSTIMESTAMP);

  l_return_date := l_start_date;

  for ctr in 1..10 loop

  dbms_scheduler.evaluate_calendar_string(

  'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15',

  l_start_date, l_return_date, l_next_date

  );

  dbms_output.put_line('Next Run on: ' ||

  to_char(l_next_date,'mm/dd/yyyy hh24:mi:ss')

  );

  l_return_date := l_next_date;

  end loop;

  end;

  /

  輸出結果如下:

  Next Run on: 03/22/2004 07:00:00

  Next Run on: 03/22/2004 15:00:00

  Next Run on: 03/23/2004 07:00:00

  Next Run on: 03/23/2004 15:00:00

  Next Run on: 03/24/2004 07:00:00

  Next Run on: 03/24/2004 15:00:00

  Next Run on: 03/25/2004 07:00:00

  Next Run on: 03/25/2004 15:00:00

  Next Run on: 03/26/2004 07:00:00

  Next Run on: 03/26/2004 15:00:00
 
 
 
上一篇《Oracle/JSP技術涉及日期和時間問題的處理》
下一篇《對Oracle學習者的一些建議:興趣很重要》
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

 
 
 
這篇論壇文章(賽迪網技術社區)針對DBMS_SCHEDULER的使用方法進行了詳盡的介紹,更多內容請參考下文: DBMS_SCHEDULER是Oracle 10G中新增的一個包,與老版本的dbms_job包相比,dbms_scheduler有很多新特性,我將通過一系列的文章來介紹一下如何使用這個包. 1. 創建job job是什麽呢? 簡單的說就是計劃(schedule)加上任務說明. 另外還有一些必須的參數. 這裏提到的"任務"可以是數據庫內部的存儲過程,匿名的PL/SQL塊,也可以是操作系統級別的腳本. 可以有兩種方式來定義"計劃": 1) 使用DBMS_SCHDULER.CREATE_SCHEDULE 定義一個計劃; 2) 調用DBMS_SCHDULER.CREATE_JOBE過程直接指定 (下面會詳細說明) 在創建一個計劃時,你至少需要指定下面的屬性,它們是job運行所必須的: 開始時間 (start_time); 重複頻率 (repeat_interval); 結束時間 (end_time) 另外,對于一個job而言,還有很多的附加參數: job_class job_priority auto_drop restartable max_runs max_failures schedule_limit logging_level 下面,我以問答的形式來具體解釋. Q1:怎麽從數據庫中查詢job的屬性 ? A1: 有兩種方法: 1) 查詢(DBA|ALL|USER)_SCHEDULER_JOBS 視圖 (提示: 根據用戶權限的不同,選擇性的查詢 DBA|ALL|USER視圖) 2) 調用DBMS_SCHEDULER包中的GET_ATTRIBUTE 過程 Q2: 怎麽設置這些屬性呢? A2: 也是有兩種方法 1) 在創建job時直接指定 2) 調用DBMS_SCHEDULER包中的SET_ATTRIBUTE 過程 Q3: "我需要什麽權限才能創建job" ? 它可以創建屬主爲任何用戶(SYS用戶除外)的job. 缺省情況下,job會被創建在當前的schema下,並且是沒有激活的; 如果要使job一創建 就自動激活,需要顯式的設置enabled 屬性爲true, 來看一個例子: begin dbms_scheduler.create_job ( job_name => 'ARC_MOVE', schedule_name => 'EVERY_60_MINS', job_type => 'EXECUTABLE', job_action => '/home/dbtools/move_arcs.sh', enabled => true, comments => 'Move Archived Logs to a Different Directory' ); end; / Q4: 能不能詳細地講述一下上面這個過程用到的各個參數? A4: job_name: 顧名思義,每個job都必須有一個的名稱 schedule_name: 如果定義了計劃,在這裏指定計劃的名稱 job_type: 目前支持三種類型: PL/SQL塊: PLSQL_BLOCK, 存儲過程: STORED_PROCEDURE 外部程序: EXECUTABLE (外部程序可以是一個shell腳本,也可以是操作系統級別的指令). job_action: 根據job_type的不同,job_action有不同的含義. 如果job_type指定的是存儲過程,就需要指定存儲過程的名字; 如果job_type指定的是PL/SQL塊,就需要輸入完整的PL/SQL代碼; 如果job_type指定的外部程序,就需要輸入script的名稱或者操作系統的指令名 enabled: 上面已經說過了,指定job創建完畢是否自動激活 comments: 對于job的簡單說明 2. 指定job的執行頻率 如果我們創建了一個job,並且希望它按照我們指定的日期和時間來運行,就需要定義job的重複頻度了. 例如每天運行,每周日的22:00運行, 每周一,三,五運行,每年的最後一個星期天運行等等. (說明:10G以前的版本,與操作系統的交互方面,實現的不是很好。例如要實現一個定期的rman備份任務,就需要結合OS的命令來實現,在UNIX下可以用crontab實現,在windows下用AT命令來實現) 10G 在這方面有了很大的增強,因爲創建job時可以直接指定操作系統的命令或者腳本,再合理的定義job的執行頻率,可以很輕松地完成複雜的調度任務. 10G 支持兩種模式的repeat_interval,一種是PL/SQL表達式,這也是dbms_job包中所使用的,例如SYSDATE+1, SYSDATE + 30/24*60; 另一種就是日曆表達式。 例如MON表示星期一,SUN表示星期天,DAY表示每天,WEEK表示每周等等. 下面來看幾個使用日曆表達式的例子: repeat_interval => 'FREQ=HOURLY; INTERVAL=2' 每隔2小時運行一次job repeat_interval => 'FREQ=DAILY' 每天運行一次job repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI" 每周的1,3,5運行job repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30' 每年的3,6,9,12月的30號運行job 用過crontab的人應該都有種似曾相識的感覺吧,呵呵 下面再說說使用日曆表達式的規則: 日曆表達式基本分爲三部分: 第一部分是頻率,也就是"FREQ"這個關鍵字,它是必須指定的; 第二部分是時間間隔,也就是"INTERVAL"這個關鍵字,取值範圍是1-999. 它是可選的參數; 最後一部分是附加的參數,可用于精確地指定日期和時間,它也是可選的參數,例如下面這些值都是合法的: BYMONTH,BYWEEKNO,BYYEARDAY,BYMONTHDAY,BYDAY BYHOUR,BYMINUTE,BYSECOND 詳細的參數說明請參考 dbms_scheduler的使用說明. 既然說到了repeat_interval,你可能要問:"有沒有一種簡便的方法來得出,或者說是評估出job的每次運行時間,以及下一次的運行時間呢?" dbms_scheduler包提供了一個過程evaluate_calendar_string,可以很方便地完成這個需求. 來看下面的例子: SQL> set serveroutput on size 999999 SQL> declare L_start_date TIMESTAMP; l_next_date TIMESTAMP; l_return_date TIMESTAMP; begin l_start_date := trunc(SYSTIMESTAMP); l_return_date := l_start_date; for ctr in 1..10 loop dbms_scheduler.evaluate_calendar_string( 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15', l_start_date, l_return_date, l_next_date ); dbms_output.put_line('Next Run on: ' || to_char(l_next_date,'mm/dd/yyyy hh24:mi:ss') ); l_return_date := l_next_date; end loop; end; / 輸出結果如下: Next Run on: 03/22/2004 07:00:00 Next Run on: 03/22/2004 15:00:00 Next Run on: 03/23/2004 07:00:00 Next Run on: 03/23/2004 15:00:00 Next Run on: 03/24/2004 07:00:00 Next Run on: 03/24/2004 15:00:00 Next Run on: 03/25/2004 07:00:00 Next Run on: 03/25/2004 15:00:00 Next Run on: 03/26/2004 07:00:00 Next Run on: 03/26/2004 15:00:00
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
微光夜曲_朦胧的美
青春校園_女生娜娜
氣質佳人_唯美動人
新年時尚魅力女生
痞子的甘南日記
疑是銀河落九天
雪域壩上四——純美色
冬日戀歌——西城楊柳弄輕柔
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有