查询不适用于带有preparedStatement的参数标记

时间:2009-06-23 10:26:59

标签: java jdbc prepared-statement

摘自代码

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

它引发了一个例外。“准备好准备包含无效使用参数标记

这可能是什么问题?


找到答案,请参阅评论

3 个答案:

答案 0 :(得分:4)

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

SELECT * FROM sch.tab1 where col1 like ?

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

答案 1 :(得分:3)

我认为卡洛斯正在做点什么。试试

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

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

答案 2 :(得分: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)。感谢Paul Chernoch!

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

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