文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle调度Schedule特性chains分析

2024-04-02 19:55

关注

本篇内容主要讲解“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 < 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分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯