Oracle调度Schedule特性chains分析

本篇内容主要讲解“Oracle调度Schedule特性chains分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle调度Schedule特性chains分析”吧!

创新互联是专业的绵竹网站建设公司,绵竹接单;提供网站建设、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行绵竹网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

举个简单的例子:运行PROGRAM:A以及PROGRAM:B,
如果成功的话继续运行PROGRAM:C,否则的话运行PROGRAM:D。Programs:A、B、C、D以及执行的逻辑关系就构成了一个最简单的CHAIN。
CHAIN的管理操作比较多:创建/删除/修改Chains,添加/修改/删除Chain Steps等等。
1、创建Chains
创建CHAIN使用DBMS_SCHEDULER.CREATE_CHAIN过程,这个过程调用非常简单,因为需要指定的参数极少
在创建Chain时,甚至可以简单到只指定一个CHAIN的名称,其它均为空即可
begin
  dbms_scheduler.create_chain('mychain1');
end;
创建好的Chains,可以通过*_SCHEDULER_CHAINS视图查看,例如:
SQL> select chain_name from user_scheduler_chains;
CHAIN_NAME
----------------
MYCHAIN1
注意,创建了CHAIN是远远不够的,只有一个CHAIN对象ORACLE还是啥也干不了(当然啦,相信从上面执行的创建语句大家也看出来了),
CHAIN对象创建之后,要做的工作其实才刚刚开始。其后,还需要定义Chain Steps以及Chain rules。

2、创建Chain Step
Chain Steps 就是用来指定CHAIN执行的操作及执行步骤,创建CHAIN STEP是通过DBMS_SCHEDULER.DEFINE_CHAIN_STEP过程进行
为刚刚创建的mychain1添加一个step
begin
  dbms_scheduler.define_chain_step(chain_name   => 'mychain1',
                                   step_name    => 'mystep1',
                                   program_name => 'myprogram1');
end;
Chain Steps 即可以调用PROGRAM(注意是program,不是procedure,当然program中可以定义执行procedure),也可以调用EVENT,甚至调用其它CHAIN(嵌套CHAIN)。
下面接着为mychain1添加两个step,操作如下:
begin
  dbms_scheduler.define_chain_step(chain_name   => 'mychain1',
                                   step_name    => 'mystep2',
                                   program_name => 'myprogram2');
  dbms_scheduler.define_chain_step(chain_name   => 'mychain1',
                                   step_name    => 'mystep3',
                                   program_name => 'myprogram3');
end;
要查询定义的Chain Steps,则是通过*_SCHEDULER_CHAIN_STEPS视图,例如:
select chain_name,step_name,program_name from user_scheduler_chain_steps;
CHAIN_NAME                     STEP_NAME                      PROGRAM_NAME
------------------------------ ------------------------------ ---------------
MYCHAIN1                       MYSTEP1                        MYPROGRAM1
MYCHAIN1                       MYSTEP2                        MYPROGRAM2
MYCHAIN1                       MYSTEP3                        MYPROGRAM3


3、创建Chain Rule
接下来,要为CHAIN的运行定义规则。定义规则是使用DBMS_SCHEDULER.DEFINE_CHAIN_RULE过程,Chain Rules依赖于Chain Steps,
每个CHAIN RULE都拥有condition和action属性,当满足condition时则执行action中指定的step。
举个例子:创建CHAIN RULE,首先执行mystep1,如果mystep1成功执行的话,就继续执行mystep2,如果mystep2也成功执行的话,则结束该CHAIN,创建脚本如下
begin
  dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
                                   condition  => 'true',
                                   action     => 'start mystep1',
                                   rule_name  => 'myrule1');
  dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
                                   condition  => 'mystep1 completed',
                                   action     => 'start mystep2',
                                   rule_name  => 'myrule2');
  dbms_scheduler.define_chain_rule(chain_name => 'mychain1',
                                   condition  => 'mystep2 completed',
                                   action     => 'end 0',
                                   rule_name  => 'myrule3');
end;
CHAIN_NAME 就不说了,这里需要注意的是CONDITION和ACTION两个参数。在为CONDITION参数指定值时,其语法看起来稍稍复杂一些,或者说是灵活,CONDITION参数值支持下列的语法形式:
TRUE
FALSE
stepname [NOT] SUCCEEDED 
stepname [NOT] FAILED 
stepname [NOT] STOPPED 
stepname [NOT] COMPLETED 
stepname ERROR_CODE IN (integer, integer, integer ...)
stepname ERROR_CODE NOT IN (integer, integer, integer ...)
stepname ERROR_CODE = integer
stepname ERROR_CODE != integer
stepname ERROR_CODE <> integer
stepname ERROR_CODE > integer
stepname ERROR_CODE >= integer
stepname ERROR_CODE < integer
stepname ERROR_CODE <= integer
甚至于,还可以制定成下列逻辑语法:
expression AND expression
expression OR expression
NOT (expression)
比如说,我们希望条件为step1成功运行,那么可以指定condition参数值如下:
'step1 completed'
Action 参数相对简单一些,这个参数用来指定当满足condition参数时,CHAIN执行的操作。

4、运行Chains
最后,来运行一下创建的mychain1吧,手动运行CHAIN是通过DBMS_SCHEDULER.RUN_CHAIN过程
begin
  dbms_scheduler.run_chain(chain_name  => 'mychain1',
                           start_steps => 'mystep1');
end;
这个语句执行可能会报错呦,注意往下看
语句执行成功,查看一下执行的结果。我们之前定义的myprogram1等program对象,实际上是调用procedure,向一个指定表test中插入记录,这里直接查询一下该表,就知道执行情况了(在此之前,test表为空):

3个procedure和3个program:
create or replace procedure P_INSERT_INTOTEST is
begin
  insert into test values(1,'beer');
  commit;
end;

create or replace procedure insert_test1 is
begin
  insert into test values (1, 'beer');
end;

begin
dbms_scheduler.create_program(program_name => 'myprogram1', program_type => 'STORED_PROCEDURE', program_action => 'insert_test1', enabled => true);
end;

create or replace procedure insert_test2 is
begin
  insert into test values (2, 'rabbit');
end;

begin
dbms_scheduler.create_program(program_name => 'myprogram2', program_type => 'STORED_PROCEDURE', program_action => 'insert_test2', enabled => true);
end;

create or replace procedure insert_test3 is
begin
  insert into test values (3, 'horse');
end;

begin
dbms_scheduler.create_program(program_name => 'myprogram3', program_type => 'STORED_PROCEDURE', program_action => 'insert_test3', enabled => true);
end;

SQL> select * from test;
     ID NAME
---------- --------------------
         1 beer
         2 rabbit
你看,test表中有了两条记录,对应前面设置的CHAIN RULE,说明mystep1和mystep2均已正确执行。

提示:Chains在执行前,必须被置于enabled状态,默认情况下刚刚创建的CHAIN都是disabled状态,要修改Chains的状态,
还是通过DBMS_SCHEDULER.ENABLE和DBMS_SCHEDULER.DISABLE两过程
begin 
  dbms_scheduler.enable('mychain1');
end;
手动执行的CHAIN的话没有系统级的日志记录,因此如果希望看到详细执行情况的话,可以创建job来执行CHAIN,例如:
begin
  dbms_scheduler.create_job(job_name        => 'chainjob1',
                            job_type        => 'CHAIN',
                            job_action      => 'mychain1',
                            repeat_interval => 'freq=daily: interval=1',
                            enabled         => true);
end;
然后,管理员或者创建者就可以通过定期观察*_scheduler_job_run_details视图来确认chain的执行情况了。

到此,相信大家对“Oracle调度Schedule特性chains分析”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享文章:Oracle调度Schedule特性chains分析
链接URL:http://scyanting.com/article/ggjcgi.html