DB2含日期字段的MERGE语句执行报错(SQLCODE=-104)求助
解决DB2 MERGE语句SQLCODE=-104语法错误问题
错误根源分析
你遇到的SQLCODE=-104是DB2明确的语法错误,结合报错信息SQLERRMC=WHEN;vt.col4,核心问题有三个:
- ON子句条件分隔符错误:DB2的MERGE ON条件必须用
AND连接,不能用逗号分隔。 - SQL语句末尾冗余逗号:INSERT的列列表、VALUES列表最后一项后的逗号属于非法语法,DB2会判定为语法错误。
- 日期参数写法不安全:用字符串拼接生成日期值容易引发格式类语法问题,还存在SQL注入风险。
修正后的代码实现
String updateSql = """ MERGE INTO MyTable AS mt USING ( SELECT * FROM TABLE ( VALUES (?, ?, ?, ?) ) ) AS vt(col1, col2, col3, col4) ON ( mt.col1 = vt.col1 AND mt.col4 = vt.col4 -- date field ) WHEN MATCHED THEN UPDATE SET col1 = vt.col1, col2 = vt.col2, col3 = vt.col3, col4 = vt.col4 -- date field WHEN NOT MATCHED THEN INSERT ( col1, col2, col3, col4 -- date field,移除末尾冗余逗号 ) VALUES ( vt.col1, vt.col2, vt.col3, vt.col4 -- date field,移除末尾冗余逗号 ) """; try { java.sql.Connection connection = em.unwrap(java.sql.Connection.class); PreparedStatement prepStatement = connection.prepareStatement(updateSql); LocalDate currentDate = LocalDate.now(); for(List item : items){ prepStatement.setLong(1, item.col1()); prepStatement.setLong(2, item.col2()); prepStatement.setLong(3, item.col3()); // 用JDBC标准方法绑定日期参数,避免字符串拼接的语法问题 prepStatement.setDate(4, java.sql.Date.valueOf(currentDate)); prepStatement.addBatch(); } prepStatement.executeBatch(); } catch (SQLException e) { // 建议添加异常日志,方便后续排查问题 e.printStackTrace(); }
关键修改说明
- ON子句语法修正:将原语句中分隔条件的逗号替换为
AND,符合DB2的MERGE语法规范。 - 移除冗余逗号:删除INSERT列列表、VALUES列表最后一项后的逗号,消除DB2的语法校验报错点。
- 日期参数绑定优化:改用
setDate方法绑定日期参数,既避免字符串拼接带来的格式问题,又提升代码安全性。
内容的提问来源于stack exchange,提问作者Jess N
相关产品推荐
相关产品推荐

