全面學習ORACLE Scheduler特性(9)建立Chains
五、使用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_P35.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 YCHAIN_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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Cache Buffer ChainsOracleAI
- Oracle Least Recently Used ChainsOracleASTAI
- Quartz job scheduler 學習quartz
- Kubernetes scheduler學習筆記筆記
- Oracle Database Scheduler整理OracleDatabase
- ORACLE dbms_scheduler.create_job建立job作業遭遇PLS-00306Oracle
- OceanBase學習之路11|體驗 DDL 新特性(Oracle 模式)Oracle模式
- Scheduler in Oracle Database 10g(轉)OracleDatabase
- 從零開始學 Oracle 練習題答案(9-10)Oracle
- Oracle定時任務dbms_schedulerOracle
- 史上最全學習率調整策略lr_scheduler
- oracle排程程式作業dbms_schedulerOracle
- oracle使用DBMS_SCHEDULER排程作業Oracle
- Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)iOS
- Python學習之高階特性Python
- 學習 iOS14 新特性,教你如何建立一個優秀的 App ClipiOSAPP
- 讓 PM 全面理解深度學習深度學習
- oracle11g: Scheduler Maintenance Tasks or Autotasks (Doc ID 756734.1)OracleAINaN
- Oracle學習路線Oracle
- Oracle學習總結Oracle
- JDK 1.8 新特性學習(Stream)JDK
- Java1.8新特性學習Java
- 學習Rust泛型與特性Rust泛型
- C#特性學習筆記C#筆記
- Oracle特性總結Oracle
- 2024/9/10學習心得
- Python學習DAY9Python
- WPF學習日記9
- Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援Oracle機器學習演算法TOML
- Python 3.8 新特性全面解讀Python
- oracle學習筆記《一》Oracle筆記
- 【REDO】Oracle redo undo 學習Oracle Redo
- Go型別特性-學習筆記Go型別筆記
- JDK11新特性學習(二)JDK
- JDK11新特性學習(一)JDK
- Flutter學習之Dart語法特性FlutterDart
- C++ 11 新特性 nullptr 學習C++Null
- Java JDK 9學習筆記JavaJDK筆記
- 9、Ktor學習-部署之容器;