我们有一个Oracle 12c AQ,其UDT有效负载包含XMLType属性。我们可以创建一个在XMLType属性符合某些条件时触发的通知程序吗?
我还没有在网上看过这个例子。
编辑=> 仅收到有关有效负载的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部分符合条件时,才会通知此订户。 &lt; =结束编辑
答案 0 :(得分:1)
您可以使用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将被排队。 Oracla称程序为&#34; cbprocedure&#34;。