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

如何在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类型参数,避免字符串转换可能带来的格式问题:

  1. 将latestPprStr转换为java.sql.Timestamp对象
  2. SQL中去掉TO_DATE函数,直接写created_when > ?
  3. 参数绑定使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:41