如何使用Oracle advanced来通知XML更改

时间:2017-02-10 00:24:00

标签: 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_AQADM.ADD_SUBSCRIBER(Queue_name => 'MYUSER.MY_LOVELY_Q'
        , Subscriber => subscriber
        , Rule => 'tab.user_data.myXMLAttr <matches some criteria>');
end;

只有当有效负载的XML部分符合条件时,才会通知此订户。 &lt; =结束编辑

1 个答案:

答案 0 :(得分:1)

您可以使用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。

payloadl - 有效载荷的长度。

永久队列的

payloadpayloadl始终为null0

reginfo - 有关注册的一些信息

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

接下来,您必须注册该程序。 AQ$_REG_INFO Type

  begin
  DBMS_AQ.REGISTER (
          SYS.AQ$_REG_INFO_LIST(
             SYS.AQ$_REG_INFO(
                'XML_QUEUE',
                DBMS_AQ.NAMESPACE_AQ,
                'plsql://CBPROCEDURE?PR=1',
                HEXTORAW('FF')
                )
             ),
          1
          );
   END;

下面 select * from USER_SUBSCR_REGISTRATIONS;已注册订阅的列表。

select * from V$SUBSCR_REGISTRATION_STATS;回拨/通知的诊断信息。

取消注册使用DBMS_AQ.UNREGISTER和相同的参数。

现在,如果新的msg将被排队。 Oracla称程序为&#34; cbprocedure&#34;。