如何在 Oracle AQ 中清除队列

Posted

技术标签:

【中文标题】如何在 Oracle AQ 中清除队列【英文标题】:How to clear a queue in Oracle AQ 【发布时间】:2011-05-14 19:07:32 【问题描述】:

我是第一次测试 Oracle AQ。我已经设法在我创建的队列中创建了 2000 行测试插入。

现在,我想清除这些。在自学时,我将到期时间设置为一个月。我不能等那么久。而且我认为我不应该将它们从队列表中删除。

最好的方法是什么?

【问题讨论】:

此解决方案与此处的示例完全相同:psoug.org/reference/dbms_aqadm.html。对于那些喜欢 Oracle 文档docs.oracle.com/cd/B19306_01/server.102/b14257/… 的人,请参阅示例 8-17 和 8-18“清除队列表中的所有消息” 【参考方案1】:

只需删除队列表即可。

没关系,只是做了检查和that's not right:

Oracle Streams AQ 不支持对队列表或关联的索引组织表 (IOT)(如果有)进行数据操作语言 (DML) 操作。唯一支持的修改队列表的方法是通过提供的 API。如果对队列表和 IOT 执行 DML 操作,它们可能会变得不一致并因此被破坏。


因此,您必须创建一个小的 PL/SQL 例程来提取项目。

使用dbms_aq 包。检查文档中的示例:Dequeuing Messages。 向下滚动一点,有一个完整的例子。

【讨论】:

我知道我无法从队列表中删除。我使用什么 API 从队列中删除消息?【参考方案2】:

您可以使用DBMS_aqadm.purge_queue_table 过程。


解决方案

SQL 看起来像这样:

-- purge queue
DECLARE
 po_t dbms_aqadm.aq$_purge_options_t;
BEGIN
  dbms_aqadm.purge_queue_table('MY_QUEUE_TABLE', NULL, po_t);
END;

【讨论】:

工作完美!非常感谢

以上是关于如何在 Oracle AQ 中清除队列的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式检查Oracle AQ队列是否存在

使用 Oracle AQ 队列配置 Web Logic JMS 模块

如何确定 DBMS_AQ.DEQUEUE_ARRAY 的负载类型

如何代表不同的用户执行 oracle DMBS_AQ.REGISTER?

docker如何清除所有运行过的容器

在 C# 中清除 Oracle 高级队列