oracle資料庫定時任務

2021-08-08 03:44:14 字數 4591 閱讀 7244

常要oracle資料庫定時的自動執行一些指令碼,或做資料庫備份,或做資料的提煉,或做資料庫的效能優化,包括重建索引等等的工作,這時需要用到乙個函式dbms_job.submit,來完成oracle定時器job時間的處理上。使用dbms_job.submit這個函式,我們只需要考慮兩個事情:安排某一任務,和定製乙個執行任務的時間點。但最重要也是最棘手的事情,我認為還是確定乙個執行任務的時間點。時間點確定了,其他的事情就好辦了。下面是函式dbms_job.submit使用方法:
dbms_job.submit( job out binary_integer,   

what       in   archar2,

next_date     in

date,

interval     in   varchar2,

no_parse     in

boolean)

dbms_job.submit( job out binary_integer,  

what       in   archar2,

next_date     in

date,

interval     in   varchar2,

no_parse     in

boolean)

其中:

●job:輸出變數,是此任務在任務佇列中的編號;

●what:執行的任務的名稱及其輸入引數;

●next_date:任務執行的時間;

●interval:任務執行的時間間隔。

其中interval這個值是決定job何時,被重新執行的關鍵;當interval設定為null時,該job執行結束後,就被從佇列中刪除。假如我們需要該job周期性地執行,則要用『sysdate+m』表示。如何更好地確定執行時間的間隔需要我們掌握乙個函式trunc。

1.trunc(for dates)

trunc函式為指定元素而截去的日期值。

其具體的語法格式如下:

trunc(date[,fmt])

其中:

date 乙個日期值

fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去

下面是該函式的使用情況:

1)按年截尾

2008-1-1

2)按月截尾

2008-3-1

3)按日截尾

2008-3-1

4)按時截尾

2008-3-1 8:00:00

5)按分截尾

2008-3-1 8:23:00

2.確定執行時間間隔

1)、 每分鐘執行

interval => trunc(sysdate,』mi』) + 1 / (24*60)

2)、 每天定時執行

例如:每天的凌晨2點執行

interval => trunc(sysdate) + 1 +2 / (24)

3)、 每週定時執行

例如:每週一凌晨2點執行

interval => trunc(next_day(sysdate,2))+2/24 –星期一,一周的第二天

4)、 每月定時執行

例如:每月1日凌晨2點執行

interval =>trunc(last_day(sysdate))+1+2/24

5)、 每季度定時執行

例如每季度的第一天凌晨2點執行

interval => trunc(add_months(sysdate,3),』q』) + 2/24

6)、 每半年定時執行

例如:每年7月1日和1月1日凌晨2點

interval => add_months(trunc(sysdate,』yyyy』),6)+2/24

7)、 每年定時執行

例如:每年1月1日凌晨2點執行

interval =>add_months(trunc(sysdate,』yyyy』),12)+2/24

3.例項

這裡提供了乙個簡單的例子,主要是完成在每乙個時間間隔內向乙個表中插入一條記錄

1)建立測試表

sql>   create   table   test(id number,cur_time   date);     

表已建立。

----建sequence

create sequence test_sequence

increment by 1

-- 每次加幾個

start with 1

-- 從1開始計數

nomaxvalue    -- 不設定最大值

nocycle      -- 一直累加,不迴圈

cache 10 ;

sql>   create   table   test(id number,cur_time   date);    

表已建立。

----建sequence

create sequence test_sequence

increment by 1

-- 每次加幾個

start with 1

-- 從1開始計數

nomaxvalue    -- 不設定最大值

nocycle      -- 一直累加,不迴圈

cache 10 ;

建觸發器**為:

create

orreplace

trigger tri_test_id

before

insert

on test --test 是表名

foreach

rowdeclare

nextid number;

begin

if :new.id is nullor :new.id=0

then --id是列名

select test_sequence.nextval --seq_id正是剛才建立的

into nextid

from sys.dual;

:new.id:=nextid;

endif;end tri_test_id;

create

orreplace

trigger tri_test_id

before

insert

on test --test 是表名

foreach

rowdeclare

nextid number;

begin

if :new.id is nullor :new.id=0

then --id是列名

select test_sequence.nextval --seq_id正是剛才建立的

into nextid

from sys.dual;

:new.id:=nextid;

endif;end tri_test_id;

2)建立乙個自定義過程

sql>   create

or replace procedure

proc_test

as

2 begin

3 insert

into

test

(cur_time)

values

(sysdate);

4end;

5 /

sql>   create

or replace procedure

proc_test

as

2 begin

3 insert

into

test

(cur_time)

values

(sysdate);

4end;

5 /

過程已建立。

3)建立job

sql> declare job1 number;   

begin

dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分鐘,即一分鐘執行test過程一次

end;

sql> declare job1 number;  

begin

dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分鐘,即一分鐘執行test過程一次

end;

pl/sql job已成功完成。

oracle資料庫定時任務

不久前,做的專案中需要用到定時任務 有兩種實現方式 應用程式,資料庫。決定採用資料庫的定時任務。關於資料庫定時任務的資料,網上有很多文章,但當自己在設計時,並沒有僅通過一篇文章就解決問題。於是決定綜合網上資料和自己的專案,寫一篇oracle資料庫自帶的job來實現定時任務。一 定時任務的建立 啟動 ...

oracle資料庫定時任務

1.定時任務樣例 一 建立乙個表 create table t free twice id number 8 primary key,name nvarchar2 20 二 建立序列 記錄id值 create sequence create sequence t free twice log min...

Oracle資料庫定時任務

查詢當前 本賬戶 已有的定時任務 select job,broken,what,interval,t.from user jobs t 刪除定時某個任務 begin dbms job.remove 24 上乙個語句查詢出的定時任務編號 commit end 建立乙個新的定時任務 declare mt...