2017-02-10 55 views
0

我們有一個Oracle 12c AQ,其UDT有效內容包含一個XMLType屬性。我們可以創建一個通知程序,當XMLType屬性匹配某些條件時觸發?如何使用Oracle高級通知XML更改

我還沒有看到這個在線任何例子。

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部分符合條件時纔會收到通知。 < =結束編輯

回答

0

您可以使用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的隊列​​是varcahr2。

payloadl - 有效載荷的長度。

​​和payloadl爲持久隊列總是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。

現在,如果新消息將被列入隊列。奧拉克拉呼籲程序「cbprocedure」。

+0

非常感謝爲我創建這個例子的努力。我正在尋找下一個步驟。只有在有效負載的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 '); 結束; 只有在有效負載的XML部分符合標準時纔會收到通知。 – shindigo

+1

瞭解,你可以做到這一點。 'ADD_SUBSCRIBER(... rule => 'tab.user_data.myXMLAttr.extract(''/ x_paTH TO ELEMENT'')。getStringVal()=''sOMETHING''')'' –