Oracle Scheduler Chain 的用法

本人是借荐他人的文章目的是学习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

时间: 2024-08-07 00:13:02

Oracle Scheduler Chain 的用法的相关文章

Scheduling Jobs with Oracle Scheduler

In this chapter: About Scheduler Objects and Their Naming Creating, Running, and Managing Jobs Creating and Managing Programs to Define Jobs Creating and Managing Schedules to Define Jobs Using Events to Start Jobs Creating and Managing Job Chains Pr

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

Oracle trunc()函数的用法

--Oracle trunc()函数的用法 /**************日期  TRUNC()函数没有秒的精确 ********************/ select sysdate from dual --当时日期 select trunc(sysdate) from dual select trunc(sysdate ,'DD') from dual --今天日期 select trunc(sysdate,'d')+7 from dual --本周星期日 select trunc(sys

Oracle to_date()函数的用法《转载》

to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明, 原文地址:http://database.51cto.com/art/201010/231193.htm 在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法,希望可以对您有所启迪. to_date()与24小时制表示法及mm分钟的显示: 一.在使用Oracle的to_date

Oracle中Cursor的用法

关键字 ?概念 ?类型 ?异常处理 一 概念 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率. 二  类型   Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor). 1. 隐式Cursor: 1).对于Selec

oracle管道函数的用法

oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端.如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline function). 关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该

Oracle MERGE INTO的用法

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

[转]Oracle trunc()函数的用法

原文地址:http://www.cnblogs.com/gengaixue/archive/2012/11/21/2781037.html 1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去.忽略它则由最近的日期截去 下面是该函数的使用情况: TRUNC(TO_DATE('24-Nov-1999 08:00 pm'),'dd-mo

Oracle to_date()函数的用法介绍

to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,需要的朋友可以参考下 在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法,希望可以对您有所启迪. to_date()与24小时制表示法及mm分钟的显示: 一.在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会直接的采用"yyyy-MM-dd HH:m