Oracle如何實現定時操作

2021-08-05 20:31:15 字數 3541 閱讀 3245

常要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)

其中:●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)按年截尾

select  trunc(to_date(『2008-03-01 08:23′,』yyyy-mm-dd hh:mi』),』yyyy』)  from dual

——————————————————————————-

2008-1-1

2)按月截尾

select  trunc(to_date(『2008-03-01 08:23′,』yyyy-mm-dd hh:mi』),』mm』)  from dual

——————————————————————————-

2008-3-1

3)按日截尾

select  trunc(to_date(『2008-03-01 08:23′,』yyyy-mm-dd hh:mi』),』dd』)  from dual

—————————————————————————–

2008-3-1

4)按時截尾

select  trunc(to_date(『2008-03-01 08:23′,』yyyy-mm-dd hh:mi』),』hh』)  from dual

—————————————————————————–

2008-3-1 8:00:00

5)按分截尾

select  trunc(to_date(『2008-03-01 08:23′,』yyyy-mm-dd hh:mi』),』mi』)  from dual

—————————————————————————–

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 ;

–建觸發器**為:

create or replace trigger tri_test_id

before insert on test 

–test 是表名

for each row

declare

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;

end if;

end tri_test_id; 

2)建立乙個自定義過程 

sql> 

create 

or replace 

procedure 

proc_test 

as 2  begin 

3  insert 

into 

test(cur_time) 

values(sysdate); 

4  end; 

5  / 

過程已建立。 

3)建立job 

sql> declare job1 number;

begin

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

end;

pl/sql 

job已成功完成。 

在Oracle中實現定時操作

眾所周知,一般作業系統會提供定時執行任務的方法,例如 unix平台上提供了讓系統定時執行任務的命令crontab。但是,對於某些需求,例如 一些對資料庫表的操作,最為典型的是 交易所每日 後的結算,它涉及大量的資料庫表操作,如果仍然利用作業系統去定時執行,不僅需要大量的程式設計工作,而且還會出現使用...

如何實現windows XP定時關機

windows xp有自帶的自動關機系統,看是麻煩,其實也很簡單 1.開始 執行 2.輸入at 22 00 shutdown s 詳細介紹 windows xp的關機是由shutdown.exe程式來控制的,位於windows system32資料夾中。如果想讓windows 2000也實現同樣的效...

Oracle如何操作LOB

dbms lob create table lob table key value integer,b lob blob,c lob clob,n lob nclob,f lob bfile insert into a table values empty blob insert into lob ...