oracle 中的chain job
                        
                            时间:2021-07-01 10:21:17
                            帮助过:21人阅读
							                        
                     
                    
                    
                    > 
select * 
from v$version 
where rownum<
2;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.
0.3.
0 -
 64bit Production
 
--
创建演示表及序列
CREATE TABLE tb_schduler
(
   id        NUMBER (10) NOT NULL,
   descr     VARCHAR2 (20) NOT NULL,
   cr_date   DATE NOT NULL,
   CONSTRAINT tb_schduler_pk PRIMARY KEY (id)
);
 
CREATE SEQUENCE tb_schduler_seq;
 
1、创建程序
--
下面定义了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、创建chain
--
创建chain比较简单,通常只需要定义一个chain名字即可,主要是用于关联后续定义rule及step
BEGIN
  DBMS_SCHEDULER.create_chain (
    chain_name          => 
‘test_chain_1‘,   -->
定义chain的名字
    rule_set_name       => NULL,             -->
可以指定规则集的名字
    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‘);   --->
当前步骤应执行的相应程序
 
  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规则
--
用于定义chain根据执行结果应该如何跳转的问题,每个CHAIN 规则都拥有condition和action 属性,
--
当满足condition 时则执行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、手动执行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/SQL procedure successfully completed.
 
参考自:https://blog.csdn.net/leshami/article/details/17096009
oracle 中的chain job
标签:根据   run_job   value   begin   star   ted   acl   过程   varchar2