用DBMS_JOB來實現高階計劃任務

lishiran發表於2008-03-26
程式有三個引數:需要提交的任務的名字、啟動任務的時間已經執行該任務的間隔時間。[@more@]

dbms_job.submit(what='statspack_alert.sql;',

next_date=sysdate+1/24, -- 在下一個小時後啟動

interval='sysdate+1/24'); -- 每小時執行一次

問題是,儘管我們在這個程式中指定了任務起始時間和重新執行的時間間隔,但是我們看不到在預定時間執行該任務的機制。例如,如何讓一個任務在早上8點啟動、每小時 執行一次、最後在下午5點終止呢?

上面的例子讓該任務每小時執行一次,但是為了獲得時間間隔,它有必要建立兩個其它任務:一個任務在下午5點終止(主)任務,另一個任務在第二天早上8點啟動(主)任務。

為了實現高階計劃任務,我們可以建立自定義間隔,讓任務在特定的時間間隔來啟動和終止。下面是一個例子:

--

--Schedule a snapshot to be run on this instance every hour

variable jobno number;

variable instno number;

begin

select instance_number into :instno from v$instance;

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

-- 提交任務從6:00開始,每小時執行一次

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

dbms_job.submit(

jobno, 'statspack.snap;',

trunc(sysdate)+6/24,

'trunc(SYSDATE+1/24,''HH'')',

TRUE,

instno);

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

-- 提交任務從9:00開始,12小時後執行

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

dbms_job.submit(

jobno,

'statspack.snap;',

trunc(sysdate+1)+9/24,

'trunc(SYSDATE+12/24,''HH'')',

TRUE,

instno);

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

-- 提交任務從6:00開始,每隔十分鐘執行一次

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

dbms_job.submit(

jobno,

'statspack.snap;',

trunc(sysdate+1/144,'MI'),

'trunc(sysdate+1/144,''MI'')',

TRUE,

instno);

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

-- 提交任務從週一到週五早上6:00開始,每小時執行一次

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

dbms_job.submit(

jobno,

'statspack.snap;',

trunc(sysdate+1)+6/24,

'trunc(

least(

next_day(SYSDATE,''MONDAY''),

next_day(SYSDATE,''TUESDAY''),

next_day(SYSDATE,''WEDNESDAY''),

next_day(SYSDATE,''THURSDAY''),

next_day(SYSDATE,''FRIDAY'')

)

+1/24,''HH'')',

TRUE,

instno);

commit;

end;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9099175/viewspace-1001527/,如需轉載,請註明出處,否則將追究法律責任。

相關文章