全面學習ORACLE Scheduler特性(9)建立Chains

junsansi發表於2009-09-04

五、使用Chains

  今天要來認識一位新同學:CHAIN(注意不要敲成CHINA)。CHAIN可以被視做一組Programs的複合,舉個簡單的例子:執行PROGRAM:A以及PROGRAM:B,如果成功的話繼續執行PROGRAM:C,否則的話執行PROGRAM:D。Programs:A、B、C、D以及執行的邏輯關係就構成了一個最簡單的CHAIN。

  關於CHAIN的管理操作比較多,比如建立/刪除/修改Chains,新增/修改/刪除Chain Steps等等。

5.1  建立Chains

5.1.1  建立CHAIN物件

  建立CHAIN使用DBMS_SCHEDULER.CREATE_CHAIN過程,這個過程呼叫非常簡單,因為需要指定的引數極少,該過程的定義如下:

    SQL> desc dbms_scheduler.create_chain;

    Parameter           Type                   Mode Default? 

    ------------------- ---------------------- ---- -------- 

    CHAIN_NAME          VARCHAR2               IN            

    RULE_SET_NAME       VARCHAR2               IN   Y        

    EVALUATION_INTERVAL INTERVAL DAY TO SECOND IN   Y        

    COMMENTS            VARCHAR2               IN   Y        

  在建立時,甚至可以簡單到只指定一個CHAIN的名稱,其它均為空即可,例如:

    SQL> exec dbms_scheduler.create_chain('my_chain1');

    PL/SQL procedure successfully completed.

  定義好的Chains,可以通過*_SCHEDULER_CHAINS檢視檢視,例如:

    SQL> select chain_name from user_scheduler_chains;

    CHAIN_NAME

    ------------------------------

    MY_CHAIN1

  注意,不是說建立了CHAIN就齊活,只有一個CHAIN物件ORACLE還是啥也幹不了(當然啦,相信從上面執行的建立語句大家也看出來了),CHAIN物件建立之後,要做的工作其實才剛剛開始。其後,還需要定義Chain Steps以及Chain rules。

5.1.2  建立Chain Step

  Chain Steps 就是用來指定CHAIN執行的操作及執行步驟,建立CHAIN STEP是通過DBMS_SCHEDULER.DEFINE_CHAIN_STEP過程進行,例如,為剛剛建立的my_chain1新增一個step,執行操作如下:

    SQL> begin

      2  DBMS_SCHEDULER.DEFINE_CHAIN_STEP (

      3     chain_name      =>  'my_chain1',

      4     step_name       =>  'my_step1',

      5     program_name    =>  'p_p1');

      6  end;

      7  /

    PL/SQL procedure successfully completed.

  Chain Steps 即可以呼叫PROGRAM(注意是program,不是procedure,當然program中可以定義執行procedure),也可以呼叫EVENT,甚至呼叫其它CHAIN(這就叫巢狀CHAIN)。

  下面接著為my_chain1新增兩個step,操作如下:

    SQL> begin

      2  DBMS_SCHEDULER.DEFINE_CHAIN_STEP (

      3     chain_name      =>  'my_chain1',

      4     step_name       =>  'my_step2',

      5     program_name    =>  'p_p2');

      6  DBMS_SCHEDULER.DEFINE_CHAIN_STEP (

      7     chain_name      =>  'my_chain1',

      8     step_name       =>  'my_step3',

      9     program_name    =>  'p_p3');

     10  end;

     11  /

    PL/SQL procedure successfully completed.

  要查詢定義的Chain Steps,則是通過*_SCHEDULER_CHAIN_STEPS檢視,例如:

    SQL> select chain_name,step_name,program_name from user_scheduler_chain_steps;

    CHAIN_NAME           STEP_NAME            PROGRAM_NAME

    -------------------- -------------------- --------------------

    MY_CHAIN1            MY_STEP1             P_P1

    MY_CHAIN1            MY_STEP2             P_P2

    MY_CHAIN1            MY_STEP3             P_P3

5.1.3  建立Chain Rule

  接下來,要為CHAIN的執行定義規則。定義規則是使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE過程,Chain Rules依賴於Chain Steps,每個CHAIN RULE都擁有condition和action屬性,當滿足condition時則執行action中指定的step。

  DBMS_SCHEDULER.DEFINE_CHAIN_RULE 過程的語法如下:

    SQL> desc dbms_scheduler.define_chain_rule;

    Parameter  Type     Mode Default? 

    ---------- -------- ---- -------- 

    CHAIN_NAME VARCHAR2 IN            

    CONDITION  VARCHAR2 IN            

    ACTION     VARCHAR2 IN            

    RULE_NAME  VARCHAR2 IN   Y        

    COMMENTS   VARCHAR2 IN   Y        

  CHAIN_NAME 就不說了,需要注意的是CONDITION和ACTION兩個引數。在為condition引數指定值時,其語法看起來稍稍複雜一些,或者說是靈活,condition引數值支援下列的語法形式:

  • TRUE
  • FALSE
  • stepname [NOT] SUCCEEDED 
  • stepname [NOT] FAILED 
  • stepname [NOT] STOPPED 
  • stepname [NOT] COMPLETED 
  • stepname ERROR_CODE IN (integer, integer, integer ...)
  • stepname ERROR_CODE NOT IN (integer, integer, integer ...)
  • stepname ERROR_CODE = integer
  • stepname ERROR_CODE != integer
  • stepname ERROR_CODE <> integer
  • stepname ERROR_CODE > integer
  • stepname ERROR_CODE >= integer
  • stepname ERROR_CODE 
  • stepname ERROR_CODE <= integer

  甚至於,還可以制定成下列邏輯語法:

  • expression AND expression
  • expression OR expression
  • NOT (expression)

  比如說,我們希望條件為step1成功執行,那麼可以指定condition引數值如下:

    'step1 completed'

  Action 引數相對簡單一些,這個引數用來指定當滿足condition引數時,CHAIN執行的操作。

  例如,建立CHAIN RULE,首先執行my_step1,如果my_step1成功執行的話,就繼續執行my_step2,如果my_step2也成功執行的話,則結束該CHAIN,建立指令碼如下:

    SQL> BEGIN

      2  DBMS_SCHEDULER.DEFINE_CHAIN_RULE (

      3     chain_name   =>   'my_chain1',

      4     condition    =>   'TRUE',

      5     action       =>   'START my_step1',

      6     rule_name    =>   'my_rule1');

      7  DBMS_SCHEDULER.DEFINE_CHAIN_RULE (

      8     chain_name   =>   'my_chain1',

      9     condition    =>   'my_step1 completed',

     10     action       =>   'START my_step2',

     11     rule_name    =>   'my_rule2');

     12  DBMS_SCHEDULER.DEFINE_CHAIN_RULE (

     13     chain_name   =>   'my_chain1',

     14     condition    =>   'my_step2 completed',

     15     action       =>   'end 0',

     16     rule_name    =>   'my_rule3');

     17  END;

     18  /

    PL/SQL procedure successfully completed.

5.1.4  執行Chains

  最後,來執行一下建立的my_chain1吧,手動執行CHAIN是通過DBMS_SCHEDULER.RUN_CHAIN過程,例如:

    SQL> BEGIN

      2  DBMS_SCHEDULER.RUN_CHAIN (

      3     chain_name    =>  'my_chain1',

      4     start_steps   =>  'my_step1');

      5  END;

      6  /

    PL/SQL procedure successfully completed.

  語句執行成功,下面需要檢視一下執行的結果。我們之前定義的p_p1等program物件,實際上是呼叫procedure,向一個指定表jss_t2中插入記錄,這裡直接查詢一下該表,就知道執行情況了(在此之前,jss_t2表為空):

    SQL> select * from jss_t2;

    TP                             DT

    ------------------------------ ------------

    p_p1 inserted                  03-SEP-09

    p_p2 inserted                  03-SEP-09

  你看,jss_t2表中有了兩條記錄,對應前面設定的CHAIN RULE,說明my_step1和my_step2均已正確執行。

    提示:Chains在執行前,必須被置於enabled狀態,預設情況下剛剛建立的CHAIN都是disabled狀態,要修改Chains的狀態,還是通過DBMS_SCHEDULER.ENABLE和DBMS_SCHEDULER.DISABLE兩過程,這裡就不演示了。

  手動執行的CHAIN的話沒有系統級的日誌記錄,因此如果希望看到詳細執行情況的話,建議建立job來執行CHAIN,例如:

    SQL> BEGIN

      2  DBMS_SCHEDULER.CREATE_JOB (

      3     job_name        => 'chain_job_1',

      4     job_type        => 'CHAIN',

      5     job_action      => 'my_chain1',

      6     repeat_interval => 'freq=daily;interval=1',

      7     enabled         => TRUE);

      8  END;

      9  /

    PL/SQL procedure successfully completed.

  然後,dba就可以通過定期觀察*_scheduler_job_run_details檢視來確認chain的執行情況了。

==============================================

全面學習ORACLE Scheduler特性(8)Application丟擲的Events

全面學習ORACLE Scheduler特性(7)Scheduler丟擲的Events

全面學習ORACLE Scheduler特性(6)設定Repeat Interval引數

全面學習ORACLE Scheduler特性(5)Schedules排程Programs執行的Jobs

全面學習ORACLE Scheduler特性(4)建立和管理Schedule

全面學習ORACLE Scheduler特性(3)使用Programs

全面學習ORACLE Scheduler特性(2)管理jobs

全面學習ORACLE Scheduler特性(1)建立jobs

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-613988/,如需轉載,請註明出處,否則將追究法律責任。

相關文章