0

我们有一个带有包含 XMLType 属性的 UDT 有效负载的 Oracle 12c AQ。我们可以创建一个在 XMLType 属性匹配某些条件时触发的通知程序吗?

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

edit=> 仅在有效负载的 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 部分与条件匹配时,此订阅者才会收到通知。<=结束编辑

4

1 回答 1

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- 有效载荷的长度。

payload并且payloadl对于持久队列总是null0

reginfo- 关于注册的一些信息

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

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

  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。

现在如果新的味精将被排队。Oracla 将过程称为“cbprocedure”。

于 2017-02-10T13:09:00.953 回答