摘自代码
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();
它引发了一个例外。“准备好准备包含无效使用参数标记”
这可能是什么问题?
找到答案,请参阅评论
答案 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”前缀。