2017-02-10 4 views
0

У нас есть Oracle 12c AQ с полезной нагрузкой UDT, содержащей атрибут XMLType. Можем ли мы создать уведомление, которое срабатывает, когда атрибут XMLType соответствует некоторым критериям?Как использовать Oracle для уведомления об изменениях XML

Я не видел никаких примеров этого онлайн.

Редактировать => Только получать уведомления о новых сообщениях, где 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 payload является varcahr2.

payloadl - длина полезной нагрузки.

payload и payloadl для постоянной очереди всегда null и 0

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 будет выставлен в очередь. Оракла называет процедуру «cbprocedure».

+0

спасибо за все усилия, чтобы создать этот пример для меня. Я ищу что-то вроде следующего шага. Только получать уведомления о новых сообщениях, где xml часть полезной нагрузки соответствует некоторым критериям. Что-то вроде: DECLARE подписчик sys.aq $ _agent; начало подписчик: = sys.aq $ _agent ('SUBSCRIBER_1', null, NULL); DBMS_AQADM.ADD_SUBSCRIBER (Queue_name => 'MYUSER.MY_LOVELY_Q', подписчик => подписчик, Rule => 'tab.user_data.myXMLAttr <соответствует некоторым критериям>'); конец; Этот абонент получит уведомление только в том случае, если XML-часть полезной нагрузки соответствует критериям. – shindigo

+1

Поймите, и вы можете это сделать. 'ADD_SUBSCRIBER (... rule => 'tab.user_data.myXMLAttr.extract (' '/ x_paTH TO ELEMENT' '). GetStringVal() =' 'sOMETHING' '') '' –

Смежные вопросы