
1.chain的相关概念和流程:
1.1
chains实际上就是一组命名的任务,实现基于依赖关系的调度的方法,在这种调度中,任务的启动取决于一个或多个先前作业的结果。
这种技术从oracle 10gR2开始引入,相当于企业级应用可能广泛度并不是太高。
1.2
1.2 要创建和使用chain,需要按以下顺序完成以下任务:
1.2.1 创建一个chain的对象,具体代码如下:

注意:
1. 使用CREATE_CHAIN过程创建一个chain。使用CREATE_CHAIN创建chain对象之后,将分别定义chain步骤和chain规则。
2. rule_set_name和evaluation_interval参数通常为空。evaluation_interval可以定义一个重复的区间,在这个区间内对chain规则求值。
rule_set_name指的是在Oracle streams中定义的规则集。
1.2.2如何定义chain的步骤,代码示例如下:

1.2.3向chain中添加规则:
注意:
1. 首先使用DEFINE_CHAIN_RULE过程向chain中添加一条规则。对于要添加到chain中的每个规则,只需要调用一次这个过程即可。
2. 确定chain rule定义步骤何时运行,并定义步骤之间的依赖关系。每个规则都有一个条件和一个动作。每当计算规则时,如果规则的条件求值为 TRUE,则执行其操作,该条件可以包含调度器chain条件语法或SQL WHERE子句中有效的任何语法。语法可以包括对任何chain步骤的属性的引用,包括步骤完成状态。
3. 调度器chain条件语法采用以下两种形式之一:

可以将条件与布尔运算符AND, OR和NOT()组合起来创建条件表达式。表达式中可以使用括号来确定求值顺序。
4.具体规则详见oracle官网:https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse009.htm#ADMIN12459
5. 下面的示例定义了一个规则,该规则在步骤1中启动chain,在步骤1完成时启动步骤2。rule_name和注释是可选的,默认为NULL。如果确实使用 rule_name,可以稍后使用另一个调用DEFINE_CHAIN_RULE重新定义该规则。新定义覆盖了前一个定义,代码示例如下:

1.2.4如何启动chain,示例代码如下:

1.2.5创建一个job调用chain:


2. 综合示例演示:
2.1
登录sys用户,新建用户,并通过DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE授予权限,示例代码如下:

注意:
如果指定表空间,想着配置配额,例如:ALTER USER chains QUOTA UNLIMITED ON tbs_oracle;
2.2
连接到新建立好的chains用户,创建两个programs

2.3
两个programs创建好了以后,我们开始按照第一章讲解的流程一次创建chain,第一步,先创建一个chains

2.4
第二步定义chain响应的步骤和规则

2.5
将chain功能启动:

2.6
通过job调用该chain


3.数据字典验证:
3.1
验证job是否生效:

3.2
验证对应测试表结果集:

3.3
验证程序是否开启

3.4
验证chain是否启动

3.5
验证chain的步骤

3.6
验证chain规则

3.7
验证chain运行状况

注意:
1.DBA_SCHEDULER_RUNNING_CHAINS显示运行chain的所有链步骤的状态
2.这些chain步骤对当前用户可见(也就是说,那些用户具有ALTER权限的chain)。
3.对于嵌套链,此数据字典还允许使用包含连接JOB_SUBNAME和STEP_JOB_SUBNAME列的CONNECT BY子句的SQL语句遍历链的层次结构
3.8
验证chain执行过程中报错信息和其他详细信息:


注意:
1.2018-10-20 14:43:09尝试调用程序期间,产生了报错信息,ORA-01950: no privileges on tablespace 'TBS_ORACLE'ORA-06512: at line 1,正是由于没有设置quota导致的。
2.后期调整quota之后,state调整为SUCCEEDED

4.删除chain任务:


5.基于event chain的处理原则:
5.1
权限控制:

5.2
新建立测试表:

注意:
1.dbms_scheduler.remove_event_queue_subscriber为删除事件队列订阅服务器,以防脚本以前已经运行过
2.dbms_scheduler.add_event_queue_subscriber为该用户的消息添加一个事件队列订阅器。
5.3
创建两个程序:

5.4
创建chain
exec DBMS_SCHEDULER.CREATE_CHAIN ( chain_name =>'my_chain');
5.5
定义chain的规则和步骤:

5.6
为chain创建一个基于event的作业:

5.7
执行作业:
exec dbms_scheduler.enable('runchain_job');
注意:repeat_interval=>'freq=secondly;interval=30',表示间隔30秒,等一会,别着急
5.8
填充作业的任务队列:
exec dbms_scheduler.disable('runchain_job');
exec DBMS_SCHEDULER.ENABLE ('my_chain');
5.9
通过匿名块,把消息队列给打印出来:

注意:结果展示如下:
Event Type : JOB_STARTED
Owner : CHAINS
Object Name : RUNCHAIN_JOB
Timestamp : 20-10月-18 03.08.11.855000 下午 +08:00
Error : 0
5.10
记得多运行几次匿名块,直到匿名块显示No more messages for chain_event就表示完成了。

6.备注信息:
6.1
不同版本的ORA-27367的报错,重新执行一下程序就好了,这个没关系的。

<点亮梦想.拒绝平庸>
长按识别二维码加入600团队


都认认真真看到这了,奖励自己个小心心吧~





