1

代码摘录

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();

它抛出一个异常。“要准备的字符串包含参数标记的无效使用

这里可能是什么问题?


找到答案,看评论

4

3 回答 3

4

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

SELECT * FROM sch.tab1 where col1 like ?

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

于 2009-06-23T10:32:46.847 回答
3

我认为卡洛斯正在做某事。尝试

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

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

于 2009-06-23T16:59:24.017 回答
0

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)。感谢保罗·切尔诺克!

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

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

于 2013-10-21T10:51:18.363 回答