0

我正在尝试将意外安装的 LOG4PLSQL 清理到错误的(即 SYS)模式中。有一个名为的队列表QTAB_LOG需要消失。我已成功停止并删除了关联的队列:

call DBMS_AQADM.STOP_QUEUE('LOG_QUEUE');
call DBMS_AQADM.DROP_QUEUE('LOG_QUEUE');

但删除队列表本身失败:

call DBMS_AQADM.DROP_QUEUE_TABLE('QTAB_LOG');

出现此错误:

SQL Error: ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_AQADM", line 240
ORA-06512: at line 1
00942. 00000 -  "table or view does not exist"

当然,以正常方式删除表格:

drop table QTAB_LOG;

不允许:

SQL Error: ORA-24005: Inappropriate utilities used to perform DDL on AQ table LOG4PLSQL.QTAB_LOG
24005. 00000 -  "must use DBMS_AQADM.DROP_QUEUE_TABLE to drop queue tables" 
*Cause:    An attempt was made to use the SQL command DROP TABLE for queue
           tables, but DROP TABLE is not supported for queue tables.
*Action:   Use the DBMS_AQADM.DROP_QUEUE_TABLE procedure instead of the
           DROP TABLE command.

我究竟做错了什么?

4

4 回答 4

3

您之前是否尝试过删除失败的队列表?这种孤立队列表的情况通常是由于某些问题导致在使用 AQ API 调用时引发异常。

我不知道这是什么时候引入的,但至少 11g 现在有一个用于 drop_queue_table 调用的 FORCE 参数,该参数作为 drop table 过程的一部分停止和删除队列。在你的情况下,它可能为时已晚,但它可能值得一试。

在 9i/10g 的日子里,"alter session set events '10851 trace name context forever, level 2'" ,后面跟着一个 DROP TABLE tname 曾经有时工作 - 不知道它是否仍然有效。

于 2010-05-12T16:05:40.150 回答
2

我使用 oracle 11g r2。下面对我来说很好。不确定是否所有版本都支持以下。

EXEC dbms_aqadm.drop_queue_table ( queue_table => '<OWNER>.<QUEUETABLE>',force=>true);

上面的命令会自动停止并删除相关的队列,然后删除队列表。

如果您想自己完成所有步骤(一切手动),请按以下顺序执行:

  1. 停止关联的队列。
  2. 删除关联的队列。
  3. 删除队列表。

我假设您将有权执行 dbms_aqadm pkg 函数,否则调用这些 pkg 将导致错误。我希望这是有道理的。

于 2017-03-23T22:23:53.987 回答
0

Alter session set events '10851 trace name context forever, level 2

于 2010-12-01T10:28:35.030 回答
0

Soln given 适用于 10.2.0.3 - 我们能够删除尝试删除的模式所有者的 user_tables 中列出的队列表:使用上面的 'alter session set events '10851 trace name context forever' 后它工作正常。

于 2013-02-07T10:12:39.367 回答