當前位置:首頁 » 存儲配置 » oracle存儲過程定時執行

oracle存儲過程定時執行

發布時間: 2024-10-22 19:08:07

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;


  • 然後下面建立一個存儲過程JOB_TEST

    (注意,這里用戶需要CREATE JOB許可權,可以用超級管理員用戶執行下面語句給指定用戶賦予該許可權)

    [sql] view plain

  • GrantCreateJobTo指定用戶名



  • [sql] view plain

  • SQL>CREATEORREPLACEPROCEDURE

  • JOB_TEST

  • BEGIN

  • INSERTINTOMY_JOB_TEST(NUM)VALUES(1);

  • END;


  • (此處要執行存儲過程不能用exec JB_TEST,這種執行方式只能在命令行中使用)
  • 使用DBMS_SCHEDULER進行定時,這里為每分鍾執行一次

    [sql] view plain

  • 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;


  • 但是這樣子定時任務並不會執行。
  • 我們可以用下面的命令查看一下scheler的狀態

    [plain] view plain

  • SQL>SELECT*FROMUSER_SCHEDULER_JOBS;

  • 此時我們可以看到enable的狀態是false的,因此我們需要去啟動定時任務
  • [plain] view plain

  • SQL>BEGIN

  • DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');


  • 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('調度名','調度屬性','調度值');



  • 至此,定時任務完成。

熱點內容
python怎麼打開idle 發布:2024-10-22 21:25:56 瀏覽:754
安卓開發版怎麼設置中文 發布:2024-10-22 21:18:09 瀏覽:941
安卓系統未找到固件怎麼辦 發布:2024-10-22 21:18:03 瀏覽:183
解壓捏煙 發布:2024-10-22 21:17:57 瀏覽:388
二維otsu演算法 發布:2024-10-22 21:06:23 瀏覽:634
福祿壽源碼 發布:2024-10-22 21:06:13 瀏覽:434
pythongoagent 發布:2024-10-22 20:42:05 瀏覽:78
matlabpid演算法 發布:2024-10-22 20:37:51 瀏覽:332
文件遍歷編程 發布:2024-10-22 20:37:47 瀏覽:622
nip伺服器地址在哪 發布:2024-10-22 20:17:48 瀏覽:621