如何使用Oracle advanced通知XML更改

如何使用Oracle advanced通知XML更改,xml,oracle,advanced-queuing,Xml,Oracle,Advanced Queuing,我们有一个Oracle 12c AQ,其UDT负载包含一个XMLType属性。我们是否可以创建一个通知程序,当XMLType属性与某些条件匹配时触发它 我没有在网上看到任何这样的例子 编辑=> 只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。比如: DECLARE subscriber sys.aq$_agent; begin subscriber := sys.aq$_agent('SUBSCRIBER_1', null, NULL); DBMS_AQA

我们有一个Oracle 12c AQ,其UDT负载包含一个XMLType属性。我们是否可以创建一个通知程序,当XMLType属性与某些条件匹配时触发它

我没有在网上看到任何这样的例子

编辑=> 只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。比如:

DECLARE subscriber sys.aq$_agent; 
begin 
    subscriber := sys.aq$_agent('SUBSCRIBER_1', null, NULL);
    DBMS_AQADM.ADD_SUBSCRIBER(Queue_name => 'MYUSER.MY_LOVELY_Q'
        , Subscriber => subscriber
        , Rule => 'tab.user_data.myXMLAttr <matches some criteria>');
end;
声明订阅服务器sys.aq$\u代理;
开始
订户:=sys.aq$\u代理('subscriber\u 1',null,null);
DBMS_AQADM.ADD_SUBSCRIBER(队列_name=>'MYUSER.MY_-Q'
,Subscriber=>Subscriber
,规则=>'tab.user_data.myxmlatr');
终止
只有当有效负载的XML部分符合条件时,才会通知此订户。
您可以使用pl sql回调机制

首先创建过程

 CREATE or replace PROCEDURE cbprocedure(
                     context  RAW,
                     reginfo  SYS.AQ$_REG_INFO,
                     descr    SYS.AQ$_DESCRIPTOR,
                     payload  varchar2,
                     payloadl NUMBER
                     ) is   
   BEGIN     
     write_log('Resived message with id='||descr.msg_id);
    /* 1).Dequge message using descr.msg_id with broser mode
       2). Check attributes in xml  
       3). Do something 
    */
  END;
对于UDT(ADT)和xmltype队列,
payload
是varcahr2

有效载荷l
-有效载荷的长度

持久队列的
payloadl
payloadl
始终为
null
0

reginfo
-有关注册的一些信息

descr
-这里我们有更多关于消息的信息
descr.msg_id
是队列表中的主键。我们可以使用它来查询表或出列指示消息

接下来,您必须注册该过程

 CREATE or replace PROCEDURE cbprocedure(
                     context  RAW,
                     reginfo  SYS.AQ$_REG_INFO,
                     descr    SYS.AQ$_DESCRIPTOR,
                     payload  varchar2,
                     payloadl NUMBER
                     ) is   
   BEGIN     
     write_log('Resived message with id='||descr.msg_id);
    /* 1).Dequge message using descr.msg_id with broser mode
       2). Check attributes in xml  
       3). Do something 
    */
  END;
这里
从用户注册中选择*已注册订阅的列表

从V$SUBSCR\u REGISTRATION\u STATS中选择*回调/通知的诊断信息

要取消注册,请使用DBMS_AQ.unregister使用相同的参数


现在,如果新消息将被排队。Oracla将过程称为“cbprocedure”。

感谢您为我创建此示例所做的所有努力。我在寻找下一步要做的事情。只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。类似于:声明订阅服务器sys.aq$\u代理;开始订户:=sys.aq$\u代理('subscriber\u 1',null,null);DBMS_AQADM.ADD_SUBSCRIBER(Queue_name=>MYUSER.MY_Q',SUBSCRIBER=>SUBSCRIBER,Rule=>tab.user_data.myxmlatr');终止只有当有效负载的XML部分符合条件时,才会通知此订户。请理解,您可以这样做<代码>添加订户(…规则=>“tab.user\u data.myXMLAttr.extract(“”/x\u元素路径“”)。getStringVal()=“”“某物”)”