常要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;
2)建立乙個自定義過程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;
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;
pl/sql job已成功完成。sql> declare job1 number;
begin
dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分鐘,即一分鐘執行test過程一次
end;
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...