分享更有价值
被信任是一种快乐

Oracle调度Schedule特性chains分析

文章页正文上

本篇内容主要讲解“Oracle调度Schedule特性chains分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle调度Schedule特性chains分析”吧!举个简单的例子:运行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 stepname ERROR_CODE 甚至于,还可以制定成下列逻辑语法:
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分析”有了更深的了解,不妨来实际操作一番吧!这里是云技术网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习免费主机域名

相关推荐: 使用Redis做缓存的原因有哪些

这篇文章给大家分享的是有关使用Redis做缓存的原因有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对Redis,百度百科给出的的解释是“Redis(Remote Dictionary Server ),即远程字典服务,是一个开…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册