Oracle CHAIN恳守,也就是鏈,是將一串需要完成的作業(yè)連在一起,根據每一個步驟完成的不同結果來確定下面的哪一個動作需要被完成若河。實際上也就是if .. then ..else。比如给郊,可能有如下的定義牡肉,step 1成功執(zhí)行,執(zhí)行step 2淆九,如果step 1執(zhí)行失敗统锤,執(zhí)行step 3毛俏,如果step 2或step 3 執(zhí)行成功,退出整個chain饲窿,如果step 2 或step 3執(zhí)行失敗煌寇,發(fā)送郵件并退出。CHAIN的主要步驟包括定義程序(做什么)逾雄、定義CHAIN步驟(總步驟)阀溶,以及CHAIN的規(guī)則(如何做)。本文主要描述了chain的一些步驟并給出示例供大家參考鸦泳。有關job银锻,program可以參考Oracle在線文檔。
一做鹰、CHAIN定義及實施的主要步驟
1击纬、創(chuàng)建程序(定義每一步驟需要執(zhí)行的子程序,調用DBMS_SCHEDULER.create_program)
2钾麸、創(chuàng)建CHAIN(調用DBMS_SCHEDULER.create_chain)
3更振、定義CHAIN步驟(也就每一步的順序)
4、定義CHAIN規(guī)則(定義每一步的執(zhí)行結果成功或失敗后的處理方式)
5饭尝、激活CHAIN
6肯腕、將chain添加到job
7、CHAIN的單步調試
二钥平、演示CHAIN的用法
[sql]?view plain?copy
--演示環(huán)境??
scott@CNMMBO>select?*?from?v$version?where?rownum<2;??
BANNER??
----------------------------------------------------------------??
OracleDatabase?10g?Release?10.2.0.3.0?-?64bit?Production??
--創(chuàng)建演示表及序列??
CREATE?TABLE?tb_schduler??
(??
id????????NUMBER?(10)NOT?NULL,??
descr?????VARCHAR2?(20)NOT?NULL,??
cr_dateDATE?NOT?NULL,??
CONSTRAINT?tb_schduler_pk?PRIMARY?KEY?(id)??
);??
CREATE?SEQUENCE?tb_schduler_seq;??
1实撒、創(chuàng)建程序??
--下面定義了3個需要用到的程序program,注意這里的program不等同于procedure或者package帖池,但是可以調用procedure或package??
--下面的program主要是用于插入記錄到測試表??
BEGIN??
??DBMS_SCHEDULER.create_program?(??
program_name???=>'test_proc_1',??
program_type???=>'PLSQL_BLOCK',??-->這里的類型定義為PLSQL_BLOCK奈惑,支持STORED?PROCEDURE/EXECUTEABLE??
program_action?=>?'BEGIN??
INSERT?INTO?tb_schduler?(id,?descr,?cr_date)??
VALUES?(tb_schduler_seq.NEXTVAL,?''test_proc_1'',?SYSDATE);??
COMMIT;??
END;',??
enabled????????=>TRUE,??
comments???????=>'Program?for?first?link?in?the?chain.');??
??DBMS_SCHEDULER.create_program?(??
program_name???=>'test_proc_2',??
program_type???=>'PLSQL_BLOCK',??
program_action?=>?'BEGIN??
INSERT?INTO?tb_schduler?(id,?descr,?cr_date)??
VALUES?(tb_schduler_seq.NEXTVAL,?''test_proc_2'',?SYSDATE);??
COMMIT;??
END;',??
enabled????????=>TRUE,??
comments???????=>'Program?for?second?link?in?the?chain.');??
??DBMS_SCHEDULER.create_program?(??
program_name???=>'test_proc_3',??
program_type???=>'PLSQL_BLOCK',??
program_action?=>?'BEGIN??
INSERT?INTO?tb_schduler?(id,?descr,?cr_date)??
VALUES?(tb_schduler_seq.NEXTVAL,?''test_proc_3'',?SYSDATE);??
COMMIT;??
END;',??
enabled????????=>TRUE,??
comments???????=>'Program?for?last?link?in?the?chain.');??
END;??
/??
2、創(chuàng)建chain??
--創(chuàng)建chain比較簡單睡汹,通常只需要定義一個chain名字即可肴甸,主要是用于關聯(lián)后續(xù)定義rule及step??
BEGIN??
??DBMS_SCHEDULER.create_chain?(??
chain_name??????????=>'test_chain_1',???-->定義chain的名字??
rule_set_name???????=>NULL,?????????????-->可以指定規(guī)則集的名字??
evaluation_interval?=>NULL,??
comments????????????=>'A?test?chain.');??
END;??
/??
3、定義chain步驟??
--下面定義chain的每一個步驟以及其對應的program_name囚巴,也就是每一步需要做什么??
BEGIN??
??DBMS_SCHEDULER.define_chain_step?(??
chain_name???=>'test_chain_1',???--->chain的名字??
step_name????=>'chain_step_1',???--->步驟地名字??
program_name?=>'test_proc_1');???--->當前步驟應執(zhí)行的相應程序??
??DBMS_SCHEDULER.define_chain_step?(??
chain_name???=>'test_chain_1',??
step_name????=>'chain_step_2',??
program_name?=>'test_proc_2');??
??DBMS_SCHEDULER.define_chain_step?(??
chain_name???=>'test_chain_1',??
step_name????=>'chain_step_3',??
program_name?=>'test_proc_3');??
END;??
/??
4原在、定義chain規(guī)則??
--用于定義chain根據執(zhí)行結果應該如何跳轉的問題,每個CHAIN?規(guī)則都擁有condition和action?屬性彤叉,??
--當滿足condition?時則執(zhí)行action中指定的step庶柿。使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE?過程??
BEGIN??
??DBMS_SCHEDULER.define_chain_rule?(??
chain_name?=>'test_chain_1',??
condition??=>'TRUE',??
action?????=>?'START?"CHAIN_STEP_1"',??
rule_name??=>'chain_rule_1',??
comments???=>'First?link?in?the?chain.');??
??DBMS_SCHEDULER.define_chain_rule?(??
chain_name?=>'test_chain_1',??
condition??=>'"CHAIN_STEP_1"?COMPLETED',??
action?????=>?'START?"CHAIN_STEP_2"',??
rule_name??=>'chain_rule_2',??
comments???=>'Second?link?in?the?chain.');??
??DBMS_SCHEDULER.define_chain_rule?(??
chain_name?=>'test_chain_1',??
condition??=>'"CHAIN_STEP_2"?COMPLETED',??
action?????=>?'START?"CHAIN_STEP_3"',??
rule_name??=>'chain_rule_3',??
comments???=>'Third?link?in?the?chain.');??
??DBMS_SCHEDULER.define_chain_rule?(??
chain_name?=>'test_chain_1',??
condition??=>'"CHAIN_STEP_3"?COMPLETED',??
action?????=>?'END',??
rule_name??=>'chain_rule_4',??
comments???=>'End?of?the?chain.');??
END;??
/??
5、激活chain??
BEGIN??
DBMS_SCHEDULER.enable?('test_chain_1');??
END;??
/??
6秽浇、將chain添加到job??
BEGIN??
??DBMS_SCHEDULER.CREATE_JOB?(??
job_name????????=>'test_chain_1_job',??
job_type????????=>'CHAIN',??
job_action??????=>'test_chain_1',??
repeat_interval?=>'freq=minutely;?interval=2',??
????start_date??????=>?SYSTIMESTAMP,??
????end_date????????=>?SYSTIMESTAMP?+?(1/48),??
enabled?????????=>FALSE);???--->值為TRUE用于激活JOB???
END;??
/??
7浮庐、手動執(zhí)行chain??
BEGIN??
??DBMS_SCHEDULER.run_chain?(??
chain_name????=>'test_chain_1',??
job_name??????=>'test_chain_1_run_job',??
start_steps???=>'chain_step_1,chain_step_3');??-->可以指定單步或多步以及所有步驟??
END;??
/??
scott@CNMMBO>select?*?from?tb_schduler;??
????????ID?DESCR????????????????CR_DATE??
----------?--------------------?-----------------??
?????????1?test_proc_1??????????20131203?14:36:03??
?????????2?test_proc_3??????????20131203?14:36:04??
--激活job?????
scott@CNMMBO>exec?dbms_scheduler.enable('test_chain_1_job');??
PL/SQLprocedure?successfully?completed.??
三、CHAIN相關狀態(tài)及視圖查詢??
[sql]?view plain?copy
scott@CNMMBO>?@job_chains??????????????--->數(shù)據字典dba_scheduler_chains??
OWNER??????CHAIN_NAME??????RULE_SET_O?RULE_SET_NAME???NUMBER_OF_RULES?NUMBER_OF_STEPS?ENABL?COMMENTS??
----------?---------------?----------?---------------?---------------?---------------?-----?---------------??
SCOTT??????TEST_CHAIN_1????SCOTT??????SCHED_RULESET$1???????????????4???????????????3TRUE??A?test?chain.??
scott@CNMMBO>?@job_chain_steps--->數(shù)據字典dba_scheduler_chain_steps??
OWNER??????CHAIN_NAME??????STEP_NAME???????PROGRAM_OW?PROGRAM_NAME????STEP_TYPE??
----------?---------------?---------------?----------?---------------?--------------??
SCOTT??????TEST_CHAIN_1????CHAIN_STEP_1????SCOTT??????TEST_PROC_1?????PROGRAM??
SCOTT??????TEST_CHAIN_1????CHAIN_STEP_2????SCOTT??????TEST_PROC_2?????PROGRAM??
SCOTT??????TEST_CHAIN_1????CHAIN_STEP_3????SCOTT??????TEST_PROC_3?????PROGRAM??
scott@CNMMBO>?@job_chain_rules--->數(shù)據字典?dba_scheduler_chain_rules??
OWNER??????CHAIN_NAME??????RULE_OWNER?RULE_NAME???????CONDITIONACTION???????????????COMMENTS??
----------?---------------?----------?---------------?-------------------------?--------------------?-------------------------??
SCOTT??????TEST_CHAIN_1????SCOTT??????CHAIN_RULE_1TRUE??????????????????????START?"CHAIN_STEP_1"?First?link?in?the?chain.??
SCOTT??????TEST_CHAIN_1????SCOTT??????CHAIN_RULE_2"CHAIN_STEP_1"?COMPLETED??START?"CHAIN_STEP_2"?Second?link?in?the?chain.??
SCOTT??????TEST_CHAIN_1????SCOTT??????CHAIN_RULE_3"CHAIN_STEP_2"?COMPLETED??START?"CHAIN_STEP_3"?Third?link?in?the?chain.??
SCOTT??????TEST_CHAIN_1????SCOTT??????CHAIN_RULE_4"CHAIN_STEP_3"?COMPLETED??END??????????????????End?of?the?chain.??
scott@CNMMBO>?@job_log_detail--->數(shù)據字典dba_scheduler_job_run_details??
Enter?valuefor?input_job_name:?test_chain_1_job??
????LOG_ID?JOB_NAME??????????????????JOB_SUBNAME?????STATUS??????????ACTUAL_START_DATE?????????????????????????????RUN_DURATION??
----------?-------------------------?---------------?---------------?---------------------------------------------?--------------------??
39002?TEST_CHAIN_1_JOB??????????CHAIN_STEP_3????SUCCEEDED???????03-DEC-13?02.43.23.735878?PM?+08:00???????????+000?00:00:00??
39001?TEST_CHAIN_1_JOB??????????CHAIN_STEP_2????SUCCEEDED???????03-DEC-13?02.43.22.847659?PM?+08:00???????????+000?00:00:00??
39000?TEST_CHAIN_1_JOB??????????CHAIN_STEP_1????SUCCEEDED???????03-DEC-13?02.43.18.735907?PM?+08:00???????????+000?00:00:00??
39003?TEST_CHAIN_1_JOB??????????????????????????SUCCEEDED???????03-DEC-13?02.43.14.759867?PM?+08:00???????????+000?00:00:09??
scott@CNMMBO>select?*?from?tb_schduler;??
????????ID?DESCR????????????????CR_DATE??
----------?--------------------?-----------------??
?????????1?test_proc_1??????????20131203?14:36:03??
?????????2?test_proc_3??????????20131203?14:36:04??
?????????3?test_proc_1??????????20131203?14:43:18??
?????????4?test_proc_2??????????20131203?14:43:22??
?????????5?test_proc_3??????????20131203?14:43:23??
四柬焕、移除CHAIN及相關JOB??
[sql]?view plain?copy
--對于與chain相關的program审残,rule梭域,由于存在依賴性,因此需要先刪除job搅轿,然后可以刪除chain病涨,program等??
scott@CNMMBO>EXEC?DBMS_SCHEDULER.drop_chain?(chain_name??=>?'test_chain_1');??
BEGIN?DBMS_SCHEDULER.drop_chain?(chain_name??=>?'test_chain_1');?END;??
*??
ERRORat?line?1:??
ORA-27479:?Cannotdrop?"SCOTT.TEST_CHAIN_1"?because?other?objects?depend?on?it??
ORA-06512:at?"SYS.DBMS_ISCHED",?line?955??
ORA-06512:at?"SYS.DBMS_ISCHED",?line?871??
ORA-06512:at?"SYS.DBMS_SCHEDULER",?line?1446??
ORA-06512:at?line?1??
EXEC?DBMS_SCHEDULER.drop_job(job_name?=>?'test_chain_1_job');??
EXEC?DBMS_SCHEDULER.drop_chain?(chain_name??=>?'test_chain_1');??
EXEC?DBMS_SCHEDULER.drop_program?(program_name??=>?'test_proc_1');??
EXEC?DBMS_SCHEDULER.drop_program?(program_name??=>?'test_proc_2');??
EXEC?DBMS_SCHEDULER.drop_program?(program_name??=>?'test_proc_3');??
DROP?TABLE?tb_schduler;??
DROP?SEQUENCE?tb_schduler_seq;??