如何使用Oracle advanced通知XML更改
我们有一个Oracle 12c AQ,其UDT负载包含一个XMLType属性。我们是否可以创建一个通知程序,当XMLType属性与某些条件匹配时触发它 我没有在网上看到任何这样的例子 编辑=> 只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。比如:如何使用Oracle advanced通知XML更改,xml,oracle,advanced-queuing,Xml,Oracle,Advanced Queuing,我们有一个Oracle 12c AQ,其UDT负载包含一个XMLType属性。我们是否可以创建一个通知程序,当XMLType属性与某些条件匹配时触发它 我没有在网上看到任何这样的例子 编辑=> 只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。比如: DECLARE subscriber sys.aq$_agent; begin subscriber := sys.aq$_agent('SUBSCRIBER_1', null, NULL); DBMS_AQA
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;
声明订阅服务器sys.aq$\u代理;
开始
订户:=sys.aq$\u代理('subscriber\u 1',null,null);
DBMS_AQADM.ADD_SUBSCRIBER(队列_name=>'MYUSER.MY_-Q'
,Subscriber=>Subscriber
,规则=>'tab.user_data.myxmlatr');
终止
只有当有效负载的XML部分符合条件时,才会通知此订户。
您可以使用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
有效载荷l
-有效载荷的长度
持久队列的payloadl
和payloadl
始终为null
和0
reginfo
-有关注册的一些信息
descr
-这里我们有更多关于消息的信息descr.msg_id
是队列表中的主键。我们可以使用它来查询表或出列指示消息
接下来,您必须注册该过程
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;
这里
从用户注册中选择*代码>已注册订阅的列表
从V$SUBSCR\u REGISTRATION\u STATS中选择*代码>回调/通知的诊断信息
要取消注册,请使用DBMS_AQ.unregister使用相同的参数
现在,如果新消息将被排队。Oracla将过程称为“cbprocedure”。感谢您为我创建此示例所做的所有努力。我在寻找下一步要做的事情。只有当有效负载的xml部分符合某些条件时,才会收到有关新消息的通知。类似于:声明订阅服务器sys.aq$\u代理;开始订户:=sys.aq$\u代理('subscriber\u 1',null,null);DBMS_AQADM.ADD_SUBSCRIBER(Queue_name=>MYUSER.MY_Q',SUBSCRIBER=>SUBSCRIBER,Rule=>tab.user_data.myxmlatr');终止只有当有效负载的XML部分符合条件时,才会通知此订户。请理解,您可以这样做<代码>添加订户(…规则=>“tab.user\u data.myXMLAttr.extract(“”/x\u元素路径“”)。getStringVal()=“”“某物”)”