2017-02-10 3 views
0

XMLType 속성을 포함하는 UDT 페이로드가있는 Oracle 12c AQ가 있습니다. XMLType 특성이 일부 조건과 일치 할 때 발생하는 알리미를 만들 수 있습니까?Oracle Advanced를 사용하여 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 항상 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는 "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', 구독자 => 구독자, 규칙 => 'tab.user_data.myXMLAttr <일부 기준>'); 끝; 이 구독자는 페이로드의 XML 부분이 조건과 일치 할 때만 알림을받습니다. – shindigo

+1

이해하시면됩니다. ('=' ')' ')' ')' ')' '' '' '' ' –