在 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(...)"。那不是日期或时间戳参数。它是一个字符串参数。您需要这样做:

  1. 从 getDateToDBFormat() 中删除 TO_TIMESTAMP 内容,并使其只是 return 格式化的 DATE/TIME 值(您显示的格式不是 oracle 时间戳,但是 DATE 类型)。

  2. 将插入内容更改为:

    "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);