ORA-01839:日期对于使用PreparedStatement

问题描述 投票:0回答:1

我正在将数据插入到我的 oracle sql 数据库中,其中一个值是 1980 年 2 月 29 日的日期。当我添加这个值时,我收到这个错误

java.sql.BatchUpdateException: ORA-01839: date not valid for month specified

    at oracle.jdbc.driver.OraclePreparedStatement.generateBatchUpdateException(OraclePreparedStatement.java:10891)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatchWithoutQueue(OraclePreparedStatement.java:10311)
    at oracle.jdbc.driver.OraclePreparedStatement.executeLargeBatch(OraclePreparedStatement.java:10016)
    at oracle.jdbc.driver.OracleStatement.executeBatch(OracleStatement.java:5420)
    at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:289)

我看到的解决方案是使用

add_months
但我无法将其与 jdbc 的PreparedStatements 一起应用。我该怎么做?这是我与准备好的语句一起使用的代码

  String personneString = "INSERT INTO personne (idPersonne, datedenaissance) VALUES (?, ?)";

  Date annivDate = (anniv == null) ? null : Date.valueOf(anniv);

  try (PreparedStatement statementPersonne = connection.prepareStatement(personneString)) {
     statementPersonne.setInt(1, idPersonne);
     statementPersonne.setDate(2,  annivDate);
     statementPersonne.addBatch();
     statementPersonne.executeBatch();
  } catch (SQLException e) {
     System.out.println("date = " + annivDate);
     e.printStackTrace();
  }

哪个打印

date = 1980-02-29

java sql oracle date jdbc
1个回答
0
投票

避免两门

Date
课程。他们有严重的缺陷。几年前,它们被 JSR 310 中定义的现代 java.time 类取代。

对于仅日期值,请使用

java.time.LocalDate

LocalDate ld = LocalDate.parse( "1980-02-29" ) ;
myPreparedStatement.setObject( … , ld ) ;

重审。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
© www.soinside.com 2019 - 2024. All rights reserved.