【问题标题】:ORA 00911 Error When SQL Statement With Where Clause Ends With Semi-Colon?ORA 00911 SQL 语句的 Where 子句以分号结尾时出错?
【发布时间】:2012-03-06 00:55:35
【问题描述】:

我收到一个 oracle 00911 错误(非法字符)。我希望有人能帮助我理解。

我正在使用以下代码在我的 oracle 11g 数据库上执行 sql 语句:

private DataTable ExecuteQuery(DbCommand query) {
    DataTable result = new DataTable();
    using (DbConnection con = CreateConnection()) {
    try {
       query.Connection = con;
       query.CommandTimeout = int.MaxValue; // don't impose a timeout
       using (DbDataAdapter dataAdapter = factory.CreateDataAdapter()) {
           dataAdapter.SelectCommand = query;
           dataAdapter.Fill(result);
       }
    }
    ...

如果我给这个函数一个带有DbCommand.CommandText 属性的东西,比如"Select * from X;",它可以正常工作,但是给定"Select * from x where y;",这将引发oracle 00911 异常。但是,如果我删除分号,它会执行得很好。

有谁知道为什么只在某些类型的语句上用分号结束语句会引发非法字符错误?

为清晰起见更新:

我用来测试导致错误的分号的确切查询是:

这个查询运行良好: SELECT * FROM Machines;

此查询生成 ORA 0911 错误: SELECT * FROM Machines WHERE ID = 47;

虽然此查询运行良好: SELECT * FROM Machines WHERE ID = 47

另外使用的提供者是Oracle.DataAccess.Client

【问题讨论】:

  • 你能显示你正在尝试执行的查询吗?
  • 字面意思是Select * from X;,另一个是Select * from x where x.foo = 'bar';
  • 你确定'bar'周围的引号字符是普通的引号字符(ascii 39)?

标签: c# oracle exception


【解决方案1】:

此行为取决于所使用的 DB 提供程序 - 一些提供程序会预先执行额外的查询(例如 SELECT COUNT(*)...)和/或向查询添加一些内容(例如 ROWID)...取决于提供程序的实现方式这种“内部行为”可能会在出现分号时导致一些奇怪的事情......它甚至可能表现不同,具体取决于 WHERE 是否存在......

在像你这样的场景中(纯SELECT/UPDATE/DELETE 语句)我从来没有在末尾添加分号,也从来没有这个问题......

出于好奇:为什么末尾有分号?

【讨论】:

  • 我认为用分号明确结束语句似乎更正确。不过,我现在已经把它删除了。谢谢
  • @user12345613 不客气 :-) 我只在 PL/SQL 中使用分号(例如在匿名块中)...
  • @user12345613 请不要忘记将有用的答案标记为已接受(请参阅meta.stackexchange.com/questions/5234/…)。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 2023-02-20
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多