如何在JDBC Template的PreparedStatement中为Oracle SQL的TO_DATE传参?
问题解决:Oracle TO_DATE函数内绑定JDBC参数导致ORA-00907错误
错误原因
你的SQL语句中TO_DATE(latestPprStr = ?, 'YYYY-MM-DD HH24:MI:SS')的写法完全错误,Oracle的TO_DATE函数第一个参数应该是要转换的字符串值,而不是变量名=占位符的形式。这种写法破坏了函数的语法结构,导致数据库解析时认为括号不匹配,抛出缺失右括号的错误。
修复步骤
1. 修正SQL语句
将SQL中的to_date(latestPprStr = ?, 'YYYY-MM-DD HH24:MI:SS')改为to_date(?, 'YYYY-MM-DD HH24:MI:SS'),去掉多余的latestPprStr =部分。
修正后的Java常量定义:
private static final String LAST_PPR_FROM_RDB = "select p.mass_id, p.* from cpm_problem p where category = '9154812121313217606' and type = '9154812121313217612' and created_when > to_date(?, 'YYYY-MM-DD HH24:MI:SS') order by created_when desc";
2. 保持原参数绑定逻辑不变
你的JDBC Template参数绑定代码是正确的,只需要修正SQL后,原有的ps.setString(1, latestPprStr)就能正常将字符串传入TO_DATE函数完成转换。
优化建议(可选)
如果created_when是DATE或TIMESTAMP类型,建议直接绑定DATE类型参数,避免字符串转换可能带来的格式问题:
- 将
latestPprStr转换为java.sql.Timestamp对象 - SQL中去掉
TO_DATE函数,直接写created_when > ? - 参数绑定使用
ps.setTimestamp(1, timestamp)
示例代码:
// 先将字符串转为Timestamp Timestamp latestPprTs = Timestamp.valueOf(latestPprStr); // 修正后的SQL:去掉TO_DATE,直接用? private static final String LAST_PPR_FROM_RDB = "select p.mass_id, p.* from cpm_problem p where category = '9154812121313217606' and type = '9154812121313217612' and created_when > ? order by created_when desc"; // 参数绑定 Ppr ppr1 = rdbJdbcTemplate.query(LAST_PPR_FROM_RDB, ps -> ps.setTimestamp(1, latestPprTs), new BeanPropertyRowMapper<>(Ppr.class)).stream().findAny().orElse(null);
内容的提问来源于stack exchange,提问作者mowka
相关产品推荐
相关产品推荐

