標籤:
本人是借薦他人的文章目的是學習dbms_scheduler建立CHAIN類型的JOB,至於EXECUTABLE類型的JOB我己經在<DBMS_SCHEDULER執行PERL指令碼載入資料>介紹了.下面轉網上相關介紹:
Oracle CHAIN,也就是鏈,是將一串需要完成的作業連在一起,根據每一個步驟完成的不同結果來確定下面的哪一個動作需要被完成。實際上也就是if .. then ..else。比如,可能有如下的定義,step 1成功執行,執行step 2,如果step 1執行失敗,執行step 3,如果step 2或step 3 執行成功,退出整個chain,如果step 2 或step 3執行失敗,發送郵件並退出。CHAIN的主要步驟包括定義程式(做什麼)、定義CHAIN步驟(總步驟),以及CHAIN的規則(如何做)。本文主要描述了chain的一些步驟並給出樣本供大家參考。有關job,program可以參考Oracle線上文檔。
CHAIN定義及實施的主要步驟
1、建立程式(定義每一步驟需要執行的子程式,調用DBMS_SCHEDULER.create_program)
2、建立CHAIN(調用DBMS_SCHEDULER.create_chain)
3、定義CHAIN步驟(也就每一步的順序)
4、定義CHAIN規則(定義每一步的執行結果成功或失敗後的處理方式)
5、啟用CHAIN
6、將chain添加到job
7、CHAIN的單步調試
本人以ETL_TEST使用者為例進行測試:
1.建立使用者並賦予許可權
create user etl_test identified by etl_test
default tablespace users
temporary tablespace temp;
grant create job to etl_test;
grant create evaluation context to etl_test;
grant create rule set to etl_test;
grant create rule to etl_test;
2.建立測試表及序列
create table tb_schduler_chain
(
id number,
job_name varchar2(30),
run_date date
);
create sequence tb_schduler_chain_seq;
3.下面為CHAIN定義及實施的主要步驟
A.建立程式,建立TEST_PRO_1,TEST_PRO_2,TEST_PRO_3三個程式,將job運行情況記錄到測試表中
begin
dbms_scheduler.create_program (
program_name => ‘TEST_PRO_1‘,
program_type => ‘PLSQL_BLOCK‘,
program_action => ‘begin
insert into tb_schduler_chain (id, job_name, run_date)
values (tb_schduler_chain_seq.nextval, ‘‘JOB_NAME_1‘‘, sysdate);
commit;
end;‘,
enabled => TRUE,
comments => ‘program for first link in the chain.‘
);
dbms_scheduler.create_program (
program_name => ‘TEST_PRO_2‘,
program_type => ‘PLSQL_BLOCK‘,
program_action => ‘begin
insert into tb_schduler_chain (id, job_name, run_date)
values (tb_schduler_chain_seq.nextval, ‘‘JOB_NAME_2‘‘, sysdate);
commit;
end;‘,
enabled => TRUE,
comments => ‘program for second link in the chain.‘);
dbms_scheduler.create_program (
program_name => ‘TEST_PRO_3‘,
program_type => ‘PLSQL_BLOCK‘,
program_action => ‘begin
insert into tb_schduler_chain (id, job_name, run_date)
values (tb_schduler_chain_seq.nextval, ‘‘JOB_NAME_3‘‘, sysdate);
commit;
end;‘,
enabled => TRUE,
comments => ‘program for last link in the chain.‘);
end;
B.建立CHAIN,此步一般只需要CHAIN名稱即可.
begin
dbms_scheduler.create_chain (
chain_name => ‘TEST_CHAIN‘,
rule_set_name => NULL,
evaluation_interval => NULL,
comments => ‘test chain‘
);
end;
C.定義STEP CHAIN 定義CHAIN的每一個步驟以及其對應的PROGRAM_NAME,也就是每一步需要做什麼
begin
dbms_scheduler.define_chain_step (
chain_name => ‘TEST_CHAIN‘,
step_name => ‘CHAIN_STEP_1‘,
program_name => ‘TEST_PRO_1‘);
dbms_scheduler.define_chain_step (
chain_name => ‘TEST_CHAIN‘,
step_name => ‘CHAIN_STEP_2‘,
program_name => ‘TEST_PRO_2‘);
dbms_scheduler.define_chain_step (
chain_name => ‘TEST_CHAIN‘,
step_name => ‘CHAIN_STEP_3‘,
program_name => ‘TEST_PRO_3‘);
end;
D.定義規則
begin
dbms_scheduler.define_chain_rule (
chain_name => ‘TEST_CHAIN‘,
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‘,
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‘,
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‘,
condition => ‘"CHAIN_STEP_3" COMPLETED‘,
action => ‘END‘,
rule_name => ‘CHAIN_RULE_4‘,
comments => ‘end of the chain.‘);
end;
F.啟用CHAIN
begin
dbms_scheduler.enable (‘TEST_CHAIN‘);
end;
G.將CHAIN添加到JOB中自動運行或手工運行或通過RUN_CHAIN給定一個JOB名稱運行
1.建立JOB自動運行
begin
dbms_scheduler.create_job (
job_name => ‘TEST_CHAIN_AUTO_JOB‘,
job_type => ‘CHAIN‘,
job_action => ‘TEST_CHAIN‘,
repeat_interval => ‘freq=minutely; interval=2‘,
start_date => systimestamp,
end_date => systimestamp + (1/48),
enabled => false);
end;
2.建立手工JOB並執行
begin
dbms_scheduler.create_job (
job_name => ‘TEST_CHAIN_MANU_JOB‘,
job_type => ‘CHAIN‘,
job_action => ‘TEST_CHAIN‘,
enabled => FALSE);
end;
begin
dbms_scheduler.enable(name => ‘TEST_CHAIN_MANU_JOB‘);
end;
3.以RUN_CHAIN方式執行,可以給定一個JOB名稱
begin
dbms_scheduler.run_chain(chain_name => ‘TEST_CHAIN‘,start_steps =>‘CHAIN_STEP_1,CHAIN_STEP_2,CHAIN_STEP_3‘ ,job_name => ‘TEST_CHAIN_RUN_JOB‘);
end;
a.刪除scheduler job
begin
dbms_scheduler.drop_job(job_name => ‘TEST_CHAIN_MANU_JOB‘);
end;
b.清除scheduler job作業記錄
begin
dbms_scheduler.purge_log();
end;
c.刪除chain
begin
dbms_scheduler.drop_chain(chain_name => ‘TEST_CHAIN‘);
end;
d.刪除program
begin
dbms_scheduler.drop_program (program_name => ‘TEST_PRO_1‘);
end;
e.刪除rule
begin
dbms_scheduler.drop_chain_rule(chain_name =>‘TEST_CHAIN‘ ,rule_name =>‘CHAIN_RULE_1‘ );
end;
f.刪除step
begin
dbms_scheduler.drop_chain_step(chain_name =>‘TEST_CHAIN‘ ,step_name =>‘CHAIN_STEP_1‘ );
end;
CHAIN相關狀態及視圖查詢
a.查看scheduler job運行狀態視圖:user_scheduler_job_run_details
b.查看scheduler job 視圖:user_scheduler_jobs
c.查看scheduler chain 視圖:user_scheduler_chains
d.查看scheduler run 視圖:user_scheduler_chain_rules
e.查看scheduler step 視圖:user_scheduler_chain_steps
f.查看sheduler program視圖:user_scheduler_programs
Oracle Scheduler Chain 的用法