oraclejob定時執行存儲過程
A. 想請教一下如何用oracle 中JOB實現定時存儲過程。
如果是10g的話就用scheler來代替job吧,比job穩定多了。
先解釋一下基礎概念,scheler 包含了以下幾個實體對象
Program -- 提供了scheler 將要運行什麼,包含program name,program type(PLsql塊、存儲過程、外部程序),program action(具體的程序實體,比如說一個PLSQL塊、或者是存儲過程的名稱、或者是外部程序的路徑加名稱) 。
Scheles -- 指定何時何種頻率來運行job,可以被不同的job重復的利用。比如說我有兩個job都要求在每天的凌晨4點運行,那麼兩個job可以同時指定相同的schele。
Jobs -- 具體的作業的名稱,依賴於那個program、schele。也可以不指定program、schele,而直接寫入program、schele的相應參數。
Chains -- 把一組program像一個單獨的實體連接在一起,作為一個對象。Job可以指向Chains代替單一的program 。這樣就能完成類似如下功能:運行A,然後運行B,當A、B都運行成功則運行C,否則運行D。
下面參考文檔邊看邊做。
1.創建一張表 create table scheler_test(id number,instime date);
2.創建一個存儲過程,實現往表中插入資料。
create or replace procere p_insSysdate as
id number;
begin
select count(*) into id from scheler_test;
insert into scheler_test values(id,sysdate);
commit;
end;
/
3.創建一個schele,這個僅僅是一個時間上的安排,由DBMS_SCHEDULER.CREATE_JOB調用。這樣就可以重用schele,並且schele在時間的安排上強大與原先的JOB 。語法如下:
BEGIN
SYS.DBMS_SCHEDULER.CREATE_SCHEDULE
(
schele_name => 'SCOTT.EVERY_MINUTE'
,start_date => NULL
,repeat_interval => 'FREQ=MINUTELY'
,end_date => NULL
,comments => NULL
);
END;
/
以下給出部分repeat_interval的寫法實例,以供參考
EVERY DAY 'FREQ=DAILY;INTERVAL=1'
EVERY MINUTE 'FREQ=MINUTELY;INTERVAL=1'
EVERY 4 HOURS ON THE HOUR 'FREQ=HOURLY;INTERVAL=4;BYMINUTE=0;BYSECOND=0'
1st DAY OF EVERY MONTH 'FREQ=DAILY;BYMONTHDAY=1'
WEEKDAYS AT 7am and 3pm 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15; BYMINUTE=0;BYSECOND=0'
4.創建DBMS_SCHEDULER.CREATE_PROGRAM,指定運行什麼樣的程序。
BEGIN
SYS.DBMS_SCHEDULER.CREATE_PROGRAM
(
program_name => 'SCOTT.PRG_INSSYSDATE'
,program_type => 'STORED_PROCEDURE'
,program_action => 'p_insSysdate'
,number_of_arguments => 0
,enabled => TRUE
,comments => NULL
);
END;
/
B. oracle 添加一個計劃任務 每天凌晨兩點 定時執行一個存儲過程 求詳細步驟!!急!!
在你的存儲過程裡面定義一個變數:
v_HH24 CHAR(2) := '00';
begin後面給變數賦值:
v_HH24 := to_char(sysdate, 'HH24');
然後在你執行的代碼外羨友核面加上:
IF v_HH24 = '02'兄掘 THEN
你的代碼;
end if;
然告游後使用下面的腳本創建job:
begin
sys.dbms_job.submit(job => :job,
what => '你的存儲過程名字;',
next_date => to_date('01-06-2013 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE+60/1440');
commit;
end;
/
C. oracle定時執行怎麼執行多個存儲過程
定時執行存儲過程,需要在job里定義;而執行多個存儲過程,則在job中定義多次即可。
運行環境:oracle 10g
1、定義其中一個job
declare
jobnonumber;
begin
dbms_job.submit(11,
what=>'pro_bdc_bh(
to_char(add_months(trunc(sysdate),-1),''yyyy''),
to_char(add_months(trunc(sysdate),-1),''MM''),
''true''
);',
next_date=>sysdate,
Interval=>'TRUNC(sysdate)+1+2/(24)');
commit;
end;
注意:其中pro_bdc_bh為存儲過程名稱,TRUNC(sysdate) + 1 +2 / (24)為定義的運行時間為每日凌晨2點。
2、然後定義另外一個job
declare
jobnonumber;
begin
dbms_job.submit(11,
what=>'p_test(
to_char(add_months(trunc(sysdate),-1),''yyyy''),
to_char(add_months(trunc(sysdate),-1),''MM''),
''true''
);',
next_date=>sysdate,
Interval=>'TRUNC(sysdate)+1+2/(24)');
commit;
end;
注意:這次運行的存儲過程名為p_test,運行時間同樣為每日凌晨2點。
3、創建job完成後,可通過具有創建job的賬號查詢創建是否成功,語句如下:
select*fromuser_jobs;
D. oracle job 時間每五分鍾執行怎麼寫
oracle job 時間每五分鍾執行:
begin
sys.dbms_job.submit(job => :job,
what => '一個存儲過程;',
Interval =>TRUNC(sysdate,'mi') + 5/ (24*60));
commit;
end;
其中:如果改成TRUNC(sysdate,'mi')+ 10/ (24*60) 就是每10分鍾執行次。每秒鍾執行次:Interval => sysdate+ 1/(24 * 60 * 60)。如果改成sysdate + 10/(24 *60 * 60)就是10秒鍾執行次。
使用dbms_job.submit方法過程,這個過程有五個參數:job、what、next_date、interval與no_parse:
1、job參數是輸出參數,由submit()過程返回的binary_ineger,這個值用來唯一標識一個工作。一般定義一個變數接收,可以去user_jobs視圖查詢job值。
2、what參數是將被執行的PL/SQL代碼塊,存儲過程名稱等。
3、next_date參數指識何時將運行這個工作。
4、interval參數何時這個工作將被重執行。
5、no_parse參數指示此工作在提交時或執行時是否應進行語法分析——true,默認值false。指示此PL/SQL代碼在它第一次執行時應進行語法分析,而FALSE指示本PL/SQL代碼應立即進行語法分析。
(4)oraclejob定時執行存儲過程擴展閱讀:
1、每天定時執行
例如:每天的凌晨1點執行
Interval =>TRUNC(sysdate) + 1 +1/ (24)
2、每周定時執行
例如:每周一凌晨1點執行:
Interval =>TRUNC(next_day(sysdate,'星期一'))+1/24
3、每月定時執行
例如:每月1日凌晨1點執行:
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/24
4、每季度定時執行
例如每季度的第一天凌晨1點執行:
Interval =>TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24