2017-02-10 1 views
0

Wir haben eine Oracle 12c AQ mit einer UDT-Nutzlast, die ein XMLType-Attribut enthält. Können wir einen Notifier erstellen, der ausgelöst wird, wenn das XMLType-Attribut einigen Kriterien entspricht?Verwendung von Oracle Advanced, um bei XML-Änderungen zu benachrichtigen

Ich habe keine Beispiele dafür online gesehen.

edit => Nur Benachrichtigung über neue Nachrichten, wo der xml-Teil der Nutzlast einige Kriterien erfüllt. So etwas wie:

Dieser Abonnent wird nur benachrichtigt, wenn der XML-Teil der Nutzlast den Kriterien entspricht. < = Ende Bearbeiten

Antwort

0

Sie können pl sql Callback-Mechanismus verwenden.

Zuerst erstellen Sie die Prozedur.

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; 

Für UDT (ADT) und XMLType Warteschlangen payload varcahr2 ist.

payloadl - Länge der Nutzlast.

payload und payloadl für beständige Warteschlange ist immer null und 0

reginfo - einige Informationen über die Registrierung

descr - hier haben wir mehr Informationen über Nachrichten. descr.msg_id ist PK in der Queue-Tabelle. Und wir können es verwenden, um eine Tabelle abzufragen oder eine Nachricht aus der Warteschlange zu entfernen.

Als nächstes müssen Sie das Verfahren registrieren. 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; 

Hier select * from USER_SUBSCR_REGISTRATIONS; Liste der abonnierten registriert.

select * from V$SUBSCR_REGISTRATION_STATS; Diagnoseinformationen für Rückruf/Benachrichtigung.

Um die Registrierung aufzuheben, verwenden Sie DBMS_AQ.UNREGISTER mit den gleichen Parametern.

Jetzt, wenn neue Nachricht in die Warteschlange eingereiht wird. Oracla nennt die Prozedur "cbprocedure".

+0

danke für alle Bemühungen, um dieses Beispiel für mich zu erstellen. Ich suche nach etwas, das der nächste Schritt ist. Wird nur über neue Nachrichten benachrichtigt, bei denen der XML-Teil der Payload mit einigen Kriterien übereinstimmt. Etwas wie: DECLARE Abonnent sys.aq $ _agent; begin Subskribent: = sys.aq $ _agent ('SUBSCRIBER_1', null, NULL); DBMS_AQADM.ADD_SUBSCRIBER (Warteschlangenname => 'MYUSER.MY_LOVELY_Q', Abonnent => Abonnent, Regel => 'tab.user_data.myXMLAttr '); Ende; Dieser Abonnent wird nur benachrichtigt, wenn der XML-Teil der Payload den Kriterien entspricht. – shindigo

+1

Verstehen Sie und Sie können dies tun. 'ADD_SUBSCRIBER (... rule => 'tab.user_data.myXMLAttr.extract (' '/ x_paTH TO ELEMENT' '). GetStringVal() =' 'SOMETHING' '') '' –

Verwandte Themen