【问题标题】:Query does not work with a parameter marker with preparedStatement查询不适用于带有preparedStatement 的参数标记
【发布时间】:2009-06-23 10:26:58
【问题描述】:

代码摘录

PreparedStatement preparedStatement =  connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower ( 'ABZ' ) ");
preparedStatement.executeQuery();

以上代码执行成功。

但是当我尝试执行此操作时

PreparedStatement preparedStatement =  connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower ( ? ) ");
preparedStatement.setString ( myValue );
preparedStatement.executeQuery();

它引发异常。"要准备的字符串包含对参数标记的无效使用"

这可能是什么问题?


找到答案,查看 cmets

【问题讨论】:

  • 这可能与 jdbc 驱动程序相关。你的数据库是什么?
  • 鉴于标签,我假设是 db2。
  • 我找到了答案。感谢保罗·切尔诺克。 -- SELECT * FROM sch.tab1 where col1 like lower ( '' || ? ) --

标签: java jdbc prepared-statement


【解决方案1】:

怀疑问题是您不能将函数直接应用于参数。是否有任何特殊原因需要在数据库中而不是在代码中执行小写? (诚​​然,我可以想到一些潜在的原因。)除非您真的需要这样做,否则我会将 SQL 更改为:

SELECT * FROM sch.tab1 where col1 like ?

并在 Java 中调用 toLower(),最好指定执行小写的适当语言环境。

【讨论】:

  • 目前我正在做“preparedStatement.setString ( 1, myValue.toLower() ); ”作为解决方法,但为什么不能使用标记来做到这一点?
  • 我不知道 - 这可能是一个 DB2 限制,或者可能是他们的 JDBC 驱动程序中的一个限制。另一种方法是创建一个存储过程,它为你做了小写......
  • 可能是因为驱动程序无法确定参数的正确数据类型...
【解决方案2】:

我认为 Carlos 正在做某事。试试

SELECT * FROM sch.tab1 where col1 like lower ( '' + ? )

或在您的 SQL 版本中传递字符串连接运算符的任何内容。强制使用字符串上下文可能会让您摆脱错误。可能需要额外的括号。

【讨论】:

  • ** '' + ? **,我从来不知道您可以在 SQL 中使用 + 运算符作为字符串。至少在 DB2 中你不能使用。
  • 接受SELECT * FROM sch.tab1 where col1 like lower ( '' || ? ) 将起作用
【解决方案3】:

供参考:我在使用NORMALIZE_STRING 函数时遇到了同样的问题:

SELECT NORMALIZE_STRING(?, NFKD) FROM sysibm.sysdummy1

错误信息:

THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT 1 OF NORMALIZE_STRING IS INVALID. SQLCODE=-171, SQLSTATE=42815, DRIVER=4.13.111

使用以下语句解决了问题 (CONCAT)。感谢 Paul Chernoch!

SELECT search_normalize(NORMALIZE_STRING(? CONCAT G'', NFKD)) FROM sysibm.sysdummy1

注意 Unicode 兼容性的“G”前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多