Oracle Scheduler Chain 的用法

      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的单步调试

 

二、演示CHAIN的用法

--演示环境
scott@CNMMBO> 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.

三、CHAIN相关状态及视图查询  

scott@CNMMBO> @job_chains              --->数据字典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               3 TRUE  A test chain.

scott@CNMMBO> @job_chain_steps         --->数据字典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         --->数据字典 dba_scheduler_chain_rules

OWNER      CHAIN_NAME      RULE_OWNER RULE_NAME       CONDITION                 ACTION               COMMENTS
---------- --------------- ---------- --------------- ------------------------- -------------------- -------------------------
SCOTT      TEST_CHAIN_1    SCOTT      CHAIN_RULE_1    TRUE                      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         --->数据字典dba_scheduler_job_run_details
Enter value for 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  

--对于与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;

*
ERROR at line 1:
ORA-27479: Cannot drop "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;

Oracle Database PL/SQL Packages and Types Reference
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm#CIHHBGGI

 

   

更多参考

有关Oracle RAC请参考
     使用crs_setperm修改RAC资源的所有者及权限     使用crs_profile管理RAC资源配置文件     RAC 数据库的启动与关闭     再说 Oracle RAC services     Services in Oracle Database 10g     Migrate datbase from single instance to Oracle RAC     Oracle RAC 连接到指定实例     Oracle RAC 负载均衡测试(结合服务器端与客户端)     Oracle RAC 服务器端连接负载均衡(Load Balance)     Oracle RAC 客户端连接负载均衡(Load Balance)     ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
     ORACLE RAC 监听配置 (listener.ora tnsnames.ora)     配置 RAC 负载均衡与故障转移     CRS-1006 , CRS-0215 故障一例 
     基于Linux (RHEL 5.5) 安装Oracle 10g RAC
     使用 runcluvfy 校验Oracle RAC安装环境

有关Oracle 网络配置相关基础以及概念性的问题请参考:
     配置非默认端口的动态服务注册
     配置sqlnet.ora限制IP访问Oracle     Oracle 监听器日志配置与管理
     设置 Oracle 监听器密码(LISTENER)     配置ORACLE 客户端连接到数据库

有关基于用户管理的备份和备份恢复的概念请参考
     Oracle 冷备份     Oracle 热备份     Oracle 备份恢复概念     Oracle 实例恢复     Oracle 基于用户管理恢复的处理     SYSTEM 表空间管理及备份恢复     SYSAUX表空间管理及恢复     Oracle 基于备份控制文件的恢复(unsing backup controlfile)

有关RMAN的备份恢复与管理请参考
     RMAN 概述及其体系结构     RMAN 配置、监控与管理     RMAN 备份详解     RMAN 还原与恢复     RMAN catalog 的创建和使用     基于catalog 创建RMAN存储脚本     基于catalog 的RMAN 备份与恢复     RMAN 备份路径困惑     使用RMAN实现异机备份恢复(WIN平台)     使用RMAN迁移文件系统数据库到ASM     linux 下RMAN备份shell脚本     使用RMAN迁移数据库到异机

有关ORACLE体系结构请参考
     Oracle 表空间与数据文件     Oracle 密码文件     Oracle 参数文件     Oracle 联机重做日志文件(ONLINE LOG FILE)     Oracle 控制文件(CONTROLFILE)     Oracle 归档日志     Oracle 回滚(ROLLBACK)和撤销(UNDO)     Oracle 数据库实例启动关闭过程     Oracle 10g SGA 的自动化管理     Oracle 实例和Oracle数据库(Oracle体系结构) 

时间: 2024-10-16 04:41:44

Oracle Scheduler Chain 的用法的相关文章

使用Toad生成Oracle Scheduler Job DDL

       最近需要在不同的数据库之前迁移Oracle scheduler job,首先想到的办法是通过datapump来直接到导出Oracle scheduler job,然后使用dump file来生成ddl文件.使用这个方法可以成功完成导出并生成sqlfile.但是在目标数据库执行时收到ORA-24150 ORA-06512 during executed sql script错误.即使是在源数据库删除之前的job再执行ddl依旧有类似的错误.主要提示的是ORA-24150: evalu

oracle 10g正则表达式REGEXP_LIKE用法详解

ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同, 但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符. POSIX 正则表达式由标准的

Oracle MERGE INTO的用法示例介绍

 这篇文章主要介绍了Oracle MERGE INTO的用法,需要的朋友可以参考下 很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作

Oracle to_date()函数的用法介绍_oracle

在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法,希望可以对您有所启迪. to_date()与24小时制表示法及mm分钟的显示: 一.在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会直接的采用"yyyy-MM-dd HH:mm:ss"的格式作为格式进行转换,但是在Oracle中会引起错误:"ORA 01810 格式代码出现两次". select

Oracle trunc()函数的用法

format为年时,精确到-----年 为月时,精确到------年,月(不管哪年,只要是相同的月和哪天) 为日时,精确到------年,月,日(不管哪年的哪月,只关心是哪天) 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去.忽略它则由最近的日期截去 下面是该函数的使用情况:  代码如下 复制代码 TRUNC(TO_DATE(

Oracle dbms_metadata.get_ddl的用法总结

dbms_metadata.get_ddl()用于获取对象的DDL,其具体用法如下. 注意:在sqlplus里,为了更好的展示DDL,需要设置如下参数: set line 200 set pagesize 0 set long 99999 set feedback off set echo off 1)获得表.索引.视图.存储过程.函数的DDL select dbms_metadata.get_ddl('TABLE','TABLE_NAME','TABLE_OWNER') from dual;

关于oracle Scheduler的介绍——管理scheduler

整理自君三思博客:http://blog.itpub.net/7607759/viewspace-612220/ 三.使用Schedules 10g 中新推出的SCHEDULER可能确实会让很多初接触的朋友感觉晕头晕脑,相比之前的jobs,SCHEDULER中新增的概念太多.比如说jobs,仍然可以理解成之前版本中的jobs,不过功能更加强大(注意10g中也仍然可以使用普通jobs,这是废话,相信看本篇文章的朋友目前应该还是这样在用),比如说program,指的是运行的程序(把要做什么单提出来了

oracle中interval函数用法详解

一.interval函数 interval函数用于将一个整形值转换成时间值date类型的年月或时分秒. oracle语法: interval 'integer [- integer]' {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} [(precision)][TO {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND}] 注: 1.年.月.日.时.分.秒可以单独使用. 2.{YEAR | MONTH} to {YE

oracle系统包——dbms_random用法及order by 小结(转)

  dbms_random是一个可以生成随机数值或者字符串的程序包. 这个包有initialize().seed().terminate().value().normal().random().string()等几个函数,但value()是最常用的,下面依次介绍各个函数的详细用法:   1.dbms_random.value方法   第一种:FUNCTION value RETURN NUMBER; 说明: 这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0.