由于队列自动订阅通知(notification)出队时出现异常后超期,队列的状态变成EXPIRED,不能按正常方式出队,数据一直保存的队列表中。
处理的方式1一种是粗暴方式,直接删除队列表数据,具体命令查官方文档。
处理方式2,从异常队列中出队,在建立队列时,会自动建立一个异常队列,我们出队时指定异常队列的名字就可以出队。代码如下:重点是指定queue_name参数为异常队列的名字,格式如AQ$XXXXX_E。“XXXXX”为你正常时的队列名,如果不知道可以从Oracle的查询。
--dequeue
declare
v_Message payloadnote;
v_MsgId RAW(16);
v_options DBMS_AQ.DEQUEUE_OPTIONS_T;
v_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
v_Recipients DBMS_AQ.AQ$_RECIPIENT_LIST_T;
begin
v_options.visibility :=DBMS_AQ.IMMEDIATE;
dbms_aq.dequeue(queue_name => 'AQ$XXXXXXXXX_E',dequeue_options => v_options,message_properties => v_properties,payload => v_Message,msgid => v_MsgId);
dbms_output.put_line('decode success,msgid is '||v_MsgId);
end;
MESSAGE_PROPERTIES_T结构中的Expired参数对正常队列出库没啥用处。
Oracle官方文档
.920/a96587/toc.htm
本文发布于:2024-01-31 22:52:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170671275831966.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |