You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:10:03