【发布时间】:2015-01-28 17:05:19
【问题描述】:
我已经阅读了很多关于这个错误的资料,但仍然没有发现错误。
我正在使用 JdbcTemplate 在某个表中插入一行,其中包含一些时间戳列 我很确定时间戳是问题所在,好像从插入中删除它工作正常)
我的代码:
private static final String INSERT_CITAS = "INSERT INTO CITAS ("
+ "idCita, idServicio, " + "fechaCita, "
+ "idEstado, idUsuarioInicial) " + "VALUES (?, ?, ?, ?, ?)";
Object[] params = {
idCita,
citaQuenda.getIdServicio(),
getDateToDBFormat(citaQuenda.getFechaCita()),
ESTADO_INICIAL,
USUARIO_INICIAL };
String queryCitas = INSERT_CITAS;
super.getJdbcTemplate().update(queryCitas, params);
protected String getDateToDBFormat(Date fechaCreacion){
return "TO_TIMESTAMP('" +
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(fechaCreacion)
+ "', 'yyyy-mm-dd hh24:mi:ss')" ;
}
还有下一个错误:
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO citas_55 (idCita, idServicio, fechaCita, idEstado, idUsuarioInicial) VALUES (?, ?, ?, ?, ?)];
ORA-01858: a non-numeric character was found where a numeric was expected
我尝试在某些 SQL 编辑器中成功执行 sql,所以我不能再感到困惑了。
作为我的参数:[461, 100, TO_TIMESTAMP('2015-01-28 00:00:01', 'yyyy-mm-dd hh24:mi:ss'), 1, 8888] 这确实有效。
INSERT INTO citas (idCita, idServicio, fechaCita, idEstado, idUsuarioInicial) VALUES (457, 100, TO_TIMESTAMP('2015-01-28 00:00:01', 'yyyy-mm-dd hh24:mi:ss') , 1, 8888);
我们将不胜感激任何形式的帮助。提前致谢!
【问题讨论】:
-
我不熟悉模板,但更新使用表元数据来决定设置什么样的参数 - 所以它会尝试使用您的字符串值
setTimestamp(),可能会引入隐式转换? -
DATE 类型和 TIMESTAMP 类型不同。您的示例显示 TO_DATE 和 TO_TIMESTAMP,请显示表定义。
-
只是一个小贴士,但两者都有效......
-
The docs say“把它留给 PreparedStatement 来猜测相应的 SQL 类型”,所以可能不像我想象的那么疯狂......所以是的,为什么不将它作为时间戳传递呢?
-
谢谢亚历克斯,你也是对的
标签: oracle date jdbc timestamp jdbctemplate