在 C# 中清除 Oracle 高级队列

Posted

技术标签:

【中文标题】在 C# 中清除 Oracle 高级队列【英文标题】:Purging an Oracle Advanced Queue in C# 【发布时间】:2015-03-16 20:54:44 【问题描述】:

我正在开发一个使用 Oracle 高级队列来控制它的 Windows 服务。命令对象将被放置在队列中,服务会将其出列并尝试执行任务。为了控制服务,我还开发了一个小命令应用程序。此应用程序会将命令放入队列,但我也希望它能够在按下按钮时通过调用 dbms_aqadm.purge_queue_table 来清除队列。我试过这两种方法。首先我尝试了:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))

    conn.Open();

    OracleCommand cmd = conn.CreateCommand();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbms_aqadm.purge_queue_table";

    cmd.Parameters.Add("queue_table", "PRISMPRO_Q_TAB");
    cmd.Parameters.Add("purge_condition", DBNull.Value);
    cmd.Parameters.Add("purge_options", DBNull.Value);

    cmd.ExecuteNonQuery();

    conn.Close();

我收到以下错误:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PURGE_QUEUE_TABLE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

dbms_aqadm.purge_queue_table 有 3 个参数,我给它传递了 3 个参数。此外,它们是正确的类型。没有理由尽我所能说明为什么会发生此错误。我无法弄清楚如何让它消失,所以我尝试了以下方法:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))

    conn.Open();

    OracleCommand cmd = conn.CreateCommand();

    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "exec dbms_aqadm.purge_queue_table('PRISMPRO_Q_TAB', NULL, NULL)";

    cmd.ExecuteNonQuery();

    conn.Close();

并得到错误:

ORA-00900: invalid SQL statement

SQL 语句不是无效的。它在 SQL Developer 中运行良好。所以在任何一种情况下,我都会收到错误消息,除非我错过了我不应该得到的东西。我想不出办法解决这个问题。有人可以告诉我我做错了什么或如何解决这个问题吗?

【问题讨论】:

您使用的是哪个版本的 Oracle?根据SO - problems calling package with varchar2,Oracle 9.2.0.6.0 中存在导致间歇性 VARCHAR2 绑定错误的错误。 我们使用的是 12c 版本 【参考方案1】:

我打赌你只需要:

cmd.BindByName = true;

【讨论】:

很遗憾不是这样。当我最初编写这个应用程序时,我使用了 Oracle 的 ODP.net,它使用了位置绑定。但是,当我遇到这个问题时,我尝试使用 Microsoft 的 System.Data.OracleClient,但这也没有解决问题。 System.Data.OracleClient默认按名称绑定参数。

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

Camel 和 JMS 以正确的顺序从高级队列中消费消息

无法从 Oracle Advanced 异常队列中删除消息

高级c#中三层架构中存在外键约束怎么删除

如何在 Oracle AQ 中清除队列

高级软件工程师和架构师的区别(转)

Linux 高级编程 - 消息队列 MsgQueue