【问题标题】:Insert timestamp with JdbcTemplate in Oracle database ( ORA-01858 )在 Oracle 数据库中插入带有 JdbcTemplate 的时间戳 (ORA-01858)
【发布时间】: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


【解决方案1】:

不要在日期/时间戳和字符串之间来回转换。

只需传递一个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);

【讨论】:

    【解决方案2】:

    我会在这里冒险,并认为我可能会看到问题所在。 getDateToDBFormat() 方法返回一个字符串类型,其中包含文本“TO_TIMESTAMP(...)”。这不是日期或时间戳参数。它是一个字符串参数。你需要这样做:

    1. 从 getDateToDBFormat() 中删除 TO_TIMESTAMP 内容并让它只返回格式化的 DATE/TIME 值(您显示的格式不是 oracle 时间戳,而是 DATE 类型)。

    2. 将插入内容更改为:

      "INSERT INTO CITAS ... VALUES (?, ?, TO_DATE(?,?) , ?, ?)"
      

    TO_DATE 调用的参数是 getDateToDBFormat() 的返回值,第二个参数是日期格式掩码。但是,您不能摆脱这种混乱并直接绑定 Java Date 类型(或 jdbc sql 等效项)吗?

    应该可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2016-03-06
      • 2020-09-19
      相关资源
      最近更新 更多