11g調度(1)

需求:每晚有先後順序的執行10個存儲。

數據庫: 11gR2

原本以爲是個easy的問題,用job就能解決了。於是找到文檔上的job使用方法,沒曾想:

The DBMS_JOB package has been superseded by theDBMS_SCHEDULER package.

好吧,又來學習一下 DBMS_SCHEDULER包!花了2天時間來實現該需求,現將學習dbms_scheduler包的使用方法做下記錄,由於該包的內容太多,我只把解決實際問題所用到的知識列出:

我的學習思路:

1:弄清概念

2:試驗

3:參照官方文檔做博客

begin:

一、概念

job:oracle中 個人理解爲:任務

program:個人理解爲 :需要被執行的程序(plsql代碼,os腳本,存儲)

scheduler:個人理解爲:定義執行的週期或者頻率

君三思的解釋是: program 負責做什麼,schedule 負責啥時候做,job 就簡單了,一個字:做!!

二、試驗

1:創建一個表:
create table t(id number(20),time_in date);

2:創建一個存儲過程:
create or replace procedure insert_t
as 
begin
     insert into t values(t_seq.nextval,sysdate);
end;
/

3:創建一個程序塊:
begin
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'my_t_pro',
program_type => 'STORED_PROCEDURE',
program_action => 't_t.insert_t',
enabled => true,
comments => 'this is a program!'
);
end;
/

DBMS_SCHEDULER.CREATE_PROGRAM的使用方法參考:

使用參考-來自官方文檔

4:創建一個schedule:
begin
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => 'my_t_scheduler',
start_date => sysdate,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
comments => 'every 2 minute'
);
end;
/

DBMS_SCHEDULER.CREATE_SCHEDULE的使用方法參考:

使用參考來自官方文檔

5:創建一個 job
begin
dbms_scheduler.create_job(
job_name => 'exec_my_t_pro',
program_name => 'my_t_pro',
schedule_name => 'my_t_scheduler',
enabled => true
);
end;
/

dbms_scheduler.create_job的使用方法參考:

使用參考整理自三思筆記
創建完成後 oracle就自動開始執行剛剛定義的job了


SQL> select * from t;
              ID TIME_IN
---------------- --------------------------------------------------------------------------------
               2     2013/3/13 7:26:22
               3     2013/3/13 7:27:21
要查看當前用戶的job相關信息 : user_scheduler_job_run_details

後續將整理幾個例子方便以後參考!!

閒了幾天,今天在回頭來看整理的內容發現還不能完成 需求:每晚有先後順序的執行10個存儲。

沒法還得繼續學習。

下面是實現該需求的測試代碼,運用到了oracle scheduler中的chain。過程如下:

1:創建2個表

create table t (id number(10),f_time date);

create table t1(id number(10),name varchar2(20));

create sequence t_seq INCREMENT BY 1 START WITH 1 noMAXVALUE NOCYCLE CACHE 20;

2:創建2個存儲:

create or replace procedure in_t

as 

begin

insert into t values(t_seq.nextval,sysdate);

commit;

end;

/

create or replace procedure in_t1
as 
   m number(10);
begin
     m := t_seq.nextval;
  insert into t1 values(m,'name'||m);
  commit;
end;
/

3:創建program  以下腳本在命令行完成

begin
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'my_t_pro',
program_type => 'STORED_PROCEDURE',
program_action => 't.in_t',
enabled => true,
comments => 'this is a program!'
);
end;
/

begin
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'my_t1_pro',
program_type => 'STORED_PROCEDURE',
program_action => 't.in_t1',
enabled => true,
comments => 'this is a program!'
);
end;
/

4:創建鏈(chain),chain的概念和使用方法在:參考整理自官方文檔

exec dbms_scheduler.create_chain('t_chain');

5:創建連的步驟(step)

begin
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
 chain_name => 't_chain',
 step_name => 's_1',
 program_name => 'my_t_pro'
 );
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
 chain_name => 't_chain',
 step_name => 's_2',
 program_name => 'my_t1_pro'
 );
end;
/

6:創建鏈的規則(rule)

begin
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name => 't_chain',
condition => 'true',
action => 'start s_1',
rule_name => 'r1'
);

DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name => 't_chain',
condition => 's_1 completed',
action => 'start s_2',
rule_name => 'r2'
);

DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
 chain_name => 't_chain',
 condition => 's_2 completed',
 action => 'end 0',
 rule_name => 'r3'
 );
end;
/

一口氣做了這麼多,還不明白是幹了些什麼?下面粗略解釋以下:

1-3不解釋!

步驟4=> 創建鏈(chain):chain就是2個或者2個以上的program按照一定的步驟(setp !如:先執行my_t_pro,後執行my_t1_pro)並在一定的規則(rule!例:如果my_t_pro執行成功後,才執行my_t1_pro,執行完成後關閉chain)下有序運行的邏輯關係稱爲鏈。該步驟創建了一個名爲 t_chain的鏈(chain)

步驟5=>給步驟4創建的鏈,指定執行的順序。

步驟6=>給步驟4創建的鏈,指定怎麼執行的規則。

創建完成後就可以手動的測試了,注意在測試前要啓用鏈(chain):

 exec  DBMS_SCHEDULER.ENABLE('t_chain');

A chain is always created as disabled and must be enabled with theENABLE Procedure before it can be used.

7:手動測試

BEGIN 
DBMS_SCHEDULER.RUN_CHAIN (
CHAIN_NAME => 't_chain',
START_STEPS => 's_1'
);
END;
/

以下是測試結果:

SQL> BEGIN
  2  DBMS_SCHEDULER.RUN_CHAIN (
  3  CHAIN_NAME => 't_chain',
  4  START_STEPS => 's_1'
  5  );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> select * from t;

        ID F_TIME
---------- ------------
         1 21-MAR-13

SQL> select * from t1;

        ID NAME
---------- --------------------
         2 name2



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章