千家信息网

Oracle调度Schedule特性chains分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Oracle调度Schedule特性chains分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Oracle调度Schedule特性c
千家信息网最后更新 2026年11月03日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 < 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分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

参数 运行 过程 成功 情况 特性 分析 调度 对象 状态 视图 语句 语法 查询 两个 例子 内容 可以通过 实际 手动 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 什么是科技互联网 互联网科技会 互联网 科技公司 科技服务与互联网 顺玮阁互联网科技 国外互联网科技网站 互联网金融科技委员会 互联网科技公司的市场部门 科技与互联网的利与弊 互联网科技产品 济南华为互联网科技产业总部基地 港股科技和互联网 互联网科技公司实习生 成都互联网科技公司工作好不好 银川新华互联网科技学校联系电话 浙南科技城互联网大厦建设工程 为客找房互联网科技公司怎么样 九思连强互联网电子科技有限公司 绵阳真晨互联网科技有限公司 上海睿民互联网科技有限公司 互联网和科技创新 互联网金融 科技金融 极限挑战互联网科技 深圳互联网科技怎么样 厦门千工互联网科技有限公司 青海科技产业互联网发展 广州有谷有贝互联网科技有限公司 信承诺互联网科技有限公司 银川新华互联网科技学校招聘
0