在 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 高级队列的主要内容,如果未能解决你的问题,请参考以下文章