Oracle调度Schedule特性chains分析

72次阅读
没有评论

共计 4933 个字符,预计需要花费 13 分钟才能阅读完成。

本篇内容主要讲解“Oracle 调度 Schedule 特性 chains 分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“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 分析”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计4933字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)