Oracle Scheduler Chain 的用法

來源:互聯網
上載者:User

標籤:

本人是借薦他人的文章目的是學習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 的用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.