使用PreparedStatement.executeUpdate()向Db2插入数据时遇SQL-104错误
问题分析与解决
错误原因
DB2的JCC JDBC驱动在处理PreparedStatement时,不允许SQL语句末尾带有分号;。你提供的插入语句INSERT INTO main.Parent (col) VALUES (?);末尾包含分号,这直接触发了SQLCODE=-104的语法错误。
佐证细节
错误日志中的SQLERRMC=;;ent (col) VALUES (?);<space>明确显示驱动将分号视为SQL语法的一部分,导致解析失败。
IDEA控制台正常执行的原因
JetBrains IDEA的数据库控制台会自动对输入的SQL进行预处理,包括自动移除语句末尾的分号,因此不会触发该错误。
解决方案
- 修正SQL语句:移除末尾的分号,改为:
INSERT INTO main.Parent (col) VALUES (?)
- 适配自研类库:在类库中针对DB2数据库添加特殊处理,自动移除所有
PreparedStatement对应的SQL语句末尾的分号,确保兼容性。
代码调整示例
确保传入conn.prepareStatement的SQL是不带分号的版本:
// 修正后的SQL,移除末尾分号 val correctedSql = query.sql.removeSuffix(";") ps = conn.prepareStatement(correctedSql, Statement.RETURN_GENERATED_KEYS)
内容的提问来源于stack exchange,提问作者Uroš Jarc
相关产品推荐
相关产品推荐

