【问题标题】:JDBC Exception when setting parameters on a prepared statement在准备好的语句上设置参数时出现 JDBC 异常
【发布时间】:2021-12-03 09:16:55
【问题描述】:

我将不胜感激以下方面的帮助:

在为 JDBC 准备语句设置参数时,我收到 JDBCException。

错误所在的查询片段如下所示

... AND (tbl1.field1, tbl2.field2) IN ((?, ?), (?, ?)) ...

我的参数列表是一个值的 ArrayList

{123, 235689, 25,2568982}

如果我在 SQLDeveloper 中运行查询,将值替换为 '?' - 我得到了正确的结果 但是,在 Java 程序中运行时,它会抛出 JDBCException

An JDBC exception occurred. Statement: SELECT ... FROM .. WHERE ..AND (tbl1.field1, 
           tbl2.field2) IN ((?, ?), (?, ?)) .. Invalid column index

调试器将我带到执行此操作的行:

statement.setLong(i, lp.longValue()); 

'statement' 是 PreparedStatement ..

【问题讨论】:

  • 您是否在循环中调用statement.setLong(i, lp.longValue()),而i 是从0 开始的int?绑定变量从 1 开始索引,而不是 0。

标签: java oracle exception jdbc


【解决方案1】:

您当前的 WHERE IN 元组语法对 Oracle 无效:

AND (tbl1.field1, tbl2.field2) IN ((?, ?), (?, ?))

这只适用于 MySQL 和其他一些数据库。您应该将其重构为:

WHERE (tbl1.field1 = ? AND tbl2.field2 = ?) OR (tbl1.field1 = ? AND tbl2.field2 = ?)

然后,迭代您的值列表并适当地分配 4 个 ? 占位符。正如上面的评论所指出的,您的确切错误可能是由于数组索引问题造成的,但即使您解决了这个问题,Oracle 的语法仍然会失败。

【讨论】:

  • “您当前的 WHERE IN 元组语法对 Oracle 无效”:该语法对我来说很好,至少在 Oracle 18c XE 中是这样。
  • @Luke 不适用于 11g,至少在我今天早些时候测试时没有。
  • 感谢您的评论。 (1.) 我不能使用建议的方法,因为我不知道我提前有多少 tbl.fields。 2 table.field 和 4 ?占位符只是一个例子.. 至少,在程序中解析和处理循环等并不是一件容易的事...... (2.) 我可以从 Oracle SQL Developer 运行构造。所以,我可以理解不同版本的 Oracle 的问题,但是......我不能同意它不能在 Oracle 中工作。
  • @DmitriyRyabin 相反,您可以相当轻松地用 Java 编写灵活的预处理语句,生成您想要的表达式。
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多