DB2 JDBC PreparedStatement用?获取指定行数报错求助
问题原因
DB2 9.7版本不支持在FETCH FIRST ... ROWS ONLY子句中使用参数占位符?,哪怕你用的是更高版本的DB2驱动,语法兼容性由数据库端决定,因此会抛出SQLCODE=-104的语法错误。当你把?替换为具体数值时,SQL语法符合DB2 9.7的要求,所以可以正常执行。
解决方案
以下是几种可行的解决方式:
1. 动态拼接SQL(注意防范SQL注入)
如果参数是可信的整数(比如来自内部逻辑,而非用户输入),可以直接拼接SQL语句:
val rowCount = 1 val ps = connection.prepareStatement("select * from tuser fetch first $rowCount rows only") ps.use { val rs = ps.executeQuery() // doSomeThing }
注意:如果参数来自不可信来源,这种方式会存在SQL注入风险,不建议使用。
2. 使用ROW_NUMBER()窗口函数替代
通过窗口函数实现分页,既支持参数占位符,又能避免SQL注入:
val ps = connection.prepareStatement(""" select * from ( select t.*, ROW_NUMBER() over() as rn from tuser t ) where rn <= ? """) ps.setObject(1, 1) ps.use { val rs = ps.executeQuery() // doSomeThing }
这种方式完全兼容DB2 9.7,且可以安全使用参数占位符。
3. 升级DB2数据库版本(可选)
如果条件允许,将DB2升级到10.1及以上版本,该版本开始支持在FETCH FIRST ... ROWS ONLY中使用参数占位符,你的原始代码就能直接运行。
内容的提问来源于stack exchange,提问作者user2545386
相关产品推荐
相关产品推荐

