我已经阅读了很多有关此错误的内容,但仍未发现错误。
我正在使用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);
任何形式的帮助将不胜感激。提前谢谢!
答案 0 :(得分:6)
不要在日期/时间戳和字符串之间来回转换。
只需将java.sql.Timestamp
实例作为参数传递:
Object[] params = {
idCita,
citaQuenda.getIdServicio(),
new java.sql.Timestamp(citaQuenda.getFechaCita()),
ESTADO_INICIAL,
USUARIO_INICIAL };
String queryCitas = INSERT_CITAS;
super.getJdbcTemplate().update(queryCitas, params);
答案 1 :(得分:3)
我会在这里走出困境,并认为我可能会看到问题所在。 getDateToDBFormat()方法返回一个String类型,其中包含文本“TO_TIMESTAMP(...)”。这不是日期或时间戳参数。这是一个字符串参数。你需要这样做:
从getDateToDBFormat()中删除TO_TIMESTAMP内容并让它返回格式化的DATE / TIME值(您显示的格式不是oracle时间戳,而是DATE类型)。
将您的插入更改为:
"INSERT INTO CITAS ... VALUES (?, ?, TO_DATE(?,?) , ?, ?)"
TO_DATE调用的参数是getDateToDBFormat()的返回值,第二个参数是日期格式掩码。但是,你不能直接摆脱那个混乱并直接绑定Java Date类型(或jdbc sql等价物)吗?
那应该有用。