oracle存儲過程定時執行
1. 想請教一下如何用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;
/
2. 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;
3. 如何使用oracle存儲過程執行外部的sql腳本文件
你把腳本內容直接在存儲過程中實現,然後利用job去定時調度就好了。
4. 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;
/
5. 有A,B兩個表,再建一個C表把A,B表中的一些欄位保存在C表中每月定時保存,用oracle怎麼寫存儲過程
A表和B的user_id是不是相同的主鍵,是的話就可以用一下的語句
CREATE OR REPLACE PROCEDURE get_A_B_to_C
BEGIN
insert to c (user_id,need_pay) select a.userid_id,b.need_pay from (selet user_id from A)a,(select user_id,need_pay from B)b where a.user_id=b.user_id and a.user_id not in user_id
END get_A_B_to_C
你想每個月執行就要見一個作業調用存儲過程 也就是JOB。
不要用select xx into xx from table
這個語句第一次執行的時候可以,第二次就會報此表已經建立 不能重復建立。
6. 各位大神們,我想在oracle後台執行多個存儲過程,請問要怎麼做呢
你是需要定時執行嗎?你說的後台執行應該就是存儲過程自動執行吧:
1、定時執行你可以創建job,可以定時每個多久執行一次存儲過程(job中可以執行多個存儲過程,只需要使用『;』隔開);
2、你可以將你所有的存儲過程打包(pkg);
7. Oracle中如何定時執行一條SQL語句
通過網上查詢,找到一種方案,就是先在oracle裡面對要定時的sql寫成存儲過程,再用DBMS_scheler對存儲過程進行定時執行。
在資料庫中新建了一個表MY_JOB_TEST
在資料庫中新建了一個表MY_JOB_TEST
在資料庫中新建了一個表MY_JOB_TEST
在PLSQL中,執行下面語句模擬存儲過程的調用,執行後要點提交才有反應
[sql] view plain
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
GrantCreateJobTo指定用戶名
SQL>CREATEORREPLACEPROCEDURE
JOB_TEST
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
- (此處要執行存儲過程不能用exec JB_TEST,這種執行方式只能在命令行中使用)
SQL>BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'SCHEDULER_TEST',
job_type=>'STORED_PROCEDURE',
job_action=>'JOB_TEST',
start_date=>sysdate,
repeat_interval=>'FREQ=MINUTELY;INTERVAL=1');
END;
- 但是這樣子定時任務並不會執行。
SQL>SELECT*FROMUSER_SCHEDULER_JOBS;
- 此時我們可以看到enable的狀態是false的,因此我們需要去啟動定時任務
SQL>BEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
然後下面建立一個存儲過程JOB_TEST
(注意,這里用戶需要CREATE JOB許可權,可以用超級管理員用戶執行下面語句給指定用戶賦予該許可權)
[sql] view plain
[sql] view plain
使用DBMS_SCHEDULER進行定時,這里為每分鍾執行一次
[sql] view plain
我們可以用下面的命令查看一下scheler的狀態
[plain] view plain
[plain] view plain
dbms_scheler.enable('j_test'); --啟用jobs
dbms_scheler.disable('j_test'); --禁用jobs
dbms_scheler.run_job('j_test'); --執行jobs
dbms_scheler.stop_job('j_test'); --停止jobs
dbms_scheler.drop_job('j_test'); --刪除jobs
然後再查詢job的enable裝態,發現為true了。
然後查看MY_JOB_TEST表,發現每分鍾會往裡面添加記錄。
當需要修改定時任務或者調度的其他屬性時,可以用下面的
dbms_scheler.set_attribute('調度名','調度屬性','調度值');
至此,定時任務完成。