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