ORA-932错误:期望日期却得到儒略日期,更新产品表遇问题
解决ORA-932错误:Date expected, got Julian Date
这个错误的核心问题其实是更新语句的参数绑定逻辑错误,不是LocalDate转Date的问题,咱们一步步拆解:
错误原因分析
你看你的更新语句:
UPDATE products SET name = ?, onMarket = onMarket-?, onStock = ? WHERE id = ?
这里的onMarket = onMarket-?,你绑定的是stmt.setDate(2, Date.valueOf(prod.getOnMarket()))——也就是把一个Date对象传到了这个参数位。
Oracle里的日期运算规则是:
日期 - 数字:返回减去N天后的新日期(符合DATE类型)日期 - 日期:返回两个日期之间的天数差(是数字,也就是错误提示里的"Julian Date"数值)
你现在的操作是拿原onMarket日期减去另一个日期,得到的是数字结果,然后要把这个数字赋值给DATE类型的onMarket字段,自然就触发了类型不匹配的ORA-932错误。
解决方案
根据你的实际需求,有两种修正方向:
1. 如果是想给onMarket减去N天(比如调整上架日期提前N天)
这种情况下,你应该把第二个参数绑定为整数类型的天数,而不是Date对象:
public void updateProducts(ArrayList<Product> collProducts) throws Exception{ String update = " UPDATE products " + " SET name = ?, " + " onMarket = onMarket - ?, " + // ?是要减去的天数(整数) " onStock = ?" + " WHERE id = ? "; PreparedStatement stmt = conn.prepareStatement(update, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); for (Product prod : collProducts) { stmt.setString(1, prod.getName()); // 替换成你实际存储"要减去的天数"的字段,比如prod.getAdjustDays() stmt.setInt(2, prod.getAdjustDays()); stmt.setInt(3, prod.getDecStock()); prod.setDecStock(0); stmt.setInt(4, prod.getId()); stmt.executeUpdate(); } // 记得关闭Statement释放资源 stmt.close(); }
2. 如果是想直接给onMarket设置新的日期
那你需要修改SQL语句,把onMarket = onMarket-?改成直接赋值:
public void updateProducts(ArrayList<Product> collProducts) throws Exception{ String update = " UPDATE products " + " SET name = ?, " + " onMarket = ?, " + // 直接绑定新日期 " onStock = ?" + " WHERE id = ? "; PreparedStatement stmt = conn.prepareStatement(update, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); for (Product prod : collProducts) { stmt.setString(1, prod.getName()); // 这里绑定LocalDate转Date是完全正确的 stmt.setDate(2, Date.valueOf(prod.getOnMarket())); stmt.setInt(3, prod.getDecStock()); prod.setDecStock(0); stmt.setInt(4, prod.getId()); stmt.executeUpdate(); } stmt.close(); }
额外提醒
你的原代码里还漏了关闭PreparedStatement的操作,记得加上,避免数据库资源泄漏哦。
内容的提问来源于stack exchange,提问作者LolIPop65
相关产品推荐
相关产品推荐

