在 Oracle 数据库中使用 JdbcTemplate 插入时间戳 (ORA-01858)
Insert timestamp with JdbcTemplate in Oracle database ( ORA-01858 )
我已经阅读了很多关于这个错误的资料,但仍然没有找到错误。
我正在使用 JdbcTemplate 在一些带有时间戳列的 table 中插入一行
我很确定时间戳是问题所在,就好像从插入中删除一样工作正常)
我的代码:
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);
如有任何帮助,我们将不胜感激。提前致谢!
我会在这里冒险,我想我可能会发现问题所在。 getDateToDBFormat() 方法是 returning 一个字符串类型,其中包含文本 "TO_TIMESTAMP(...)"。那不是日期或时间戳参数。它是一个字符串参数。您需要这样做:
从 getDateToDBFormat() 中删除 TO_TIMESTAMP 内容,并使其只是 return 格式化的 DATE/TIME 值(您显示的格式不是 oracle 时间戳,但是 DATE 类型)。
将插入内容更改为:
"INSERT INTO CITAS ... VALUES (?, ?, TO_DATE(?,?) , ?, ?)"
其中 TO_DATE 调用的参数是来自 getDateToDBFormat() 的 return,第二个参数是日期格式掩码。但是,你不能摆脱那个混乱并直接绑定一个 Java 日期类型(或 jdbc sql 等价物)吗?
应该可以。
不要在dates/timestamps 和字符串之间来回转换。
只需传递一个 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);
我已经阅读了很多关于这个错误的资料,但仍然没有找到错误。
我正在使用 JdbcTemplate 在一些带有时间戳列的 table 中插入一行 我很确定时间戳是问题所在,就好像从插入中删除一样工作正常)
我的代码:
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);
如有任何帮助,我们将不胜感激。提前致谢!
我会在这里冒险,我想我可能会发现问题所在。 getDateToDBFormat() 方法是 returning 一个字符串类型,其中包含文本 "TO_TIMESTAMP(...)"。那不是日期或时间戳参数。它是一个字符串参数。您需要这样做:
从 getDateToDBFormat() 中删除 TO_TIMESTAMP 内容,并使其只是 return 格式化的 DATE/TIME 值(您显示的格式不是 oracle 时间戳,但是 DATE 类型)。
将插入内容更改为:
"INSERT INTO CITAS ... VALUES (?, ?, TO_DATE(?,?) , ?, ?)"
其中 TO_DATE 调用的参数是来自 getDateToDBFormat() 的 return,第二个参数是日期格式掩码。但是,你不能摆脱那个混乱并直接绑定一个 Java 日期类型(或 jdbc sql 等价物)吗?
应该可以。
不要在dates/timestamps 和字符串之间来回转换。
只需传递一个 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);