Oracle CHAIN,也就是鏈,是將一串需要完成的作業(yè)連在一起,根據(jù)每一個(gè)步驟完成的不同結(jié)果來(lái)確定下面的哪一個(gè)動(dòng)作需要被完成。實(shí)際上也就是if .. then ..else。比如,可能有如下的定義,step 1成功執(zhí)行,執(zhí)行step 2,如果step 1執(zhí)行失敗,執(zhí)行step 3,如果step 2或step 3 執(zhí)行成功,退出整個(gè)chain,如果step 2 或step 3執(zhí)行失敗,發(fā)送郵件并退出。CHAIN的主要步驟包括定義程序(做什么)、定義CHAIN步驟(總步驟),以及CHAIN的規(guī)則(如何做)。本文主要描述了chain的一些步驟并給出示例供大家參考。有關(guān)job,program可以參考Oracle在線(xiàn)文檔。
一、CHAIN定義及實(shí)施的主要步驟
1、創(chuàng)建程序(定義每一步驟需要執(zhí)行的子程序,調(diào)用DBMS_SCHEDULER.create_program)
2、創(chuàng)建CHAIN(調(diào)用DBMS_SCHEDULER.create_chain)
3、定義CHAIN步驟(也就每一步的順序)
4、定義CHAIN規(guī)則(定義每一步的執(zhí)行結(jié)果成功或失敗后的處理方式)
5、激活CHAIN
6、將chain添加到j(luò)ob
7、CHAIN的單步調(diào)試
二、演示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個(gè)需要用到的程序program,注意這里的program不等同于procedure或者package,但是可以調(diào)用procedure或package??
--下面的program主要是用于插入記錄到測(cè)試表??
BEGIN??
??DBMS_SCHEDULER.create_program?(??
program_name???=>'test_proc_1',??
program_type???=>'PLSQL_BLOCK',??-->這里的類(lèi)型定義為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比較簡(jiǎn)單,通常只需要定義一個(gè)chain名字即可,主要是用于關(guān)聯(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的每一個(gè)步驟以及其對(duì)應(yīng)的program_name,也就是每一步需要做什么??
BEGIN??
??DBMS_SCHEDULER.define_chain_step?(??
chain_name???=>'test_chain_1',???--->chain的名字??
step_name????=>'chain_step_1',???--->步驟地名字??
program_name?=>'test_proc_1');???--->當(dāng)前步驟應(yīng)執(zhí)行的相應(yīng)程序??
??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根據(jù)執(zhí)行結(jié)果應(yīng)該如何跳轉(zhuǎn)的問(wèn)題,每個(gè)CHAIN?規(guī)則都擁有condition和action?屬性,??
--當(dāng)滿(mǎn)足condition?時(shí)則執(zhí)行action中指定的step。使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE?過(guò)程??
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添加到j(luò)ob??
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);???--->值為T(mén)RUE用于激活JOB???
END;??
/??
7、手動(dòng)執(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相關(guān)狀態(tài)及視圖查詢(xún)??
[sql]?view plain?copy
scott@CNMMBO>?@job_chains??????????????--->數(shù)據(jù)字典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ù)據(jù)字典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ù)據(jù)字典?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ù)據(jù)字典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及相關(guān)JOB??
[sql]?view plain?copy
--對(duì)于與chain相關(guān)的program,rule,由于存在依賴(lài)性,因此需要先刪除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;??