【问题标题】:Calling Oracle stored procedure with DATE input doesn't set the HH:MM:SS使用 DATE 输入调用 Oracle 存储过程不会设置 HH:MM:SS
【发布时间】:2013-02-06 01:12:18
【问题描述】:

我正在尝试使用 Spring 'CallableStatementCreator' 在 Java EE Web 应用程序 (java) 中调用 Oracle 存储过程。存储过程的输入之一是 DATE。

我的 attributeValue 是一个 java.util.date,它正确地保存了 DD-MM-YYYY 和 HH:MM:SS。 使用以下代码时:

callableStmt.setTime(6, new java.sql.Time(attributeValue.getTime()));

结果是数据库中的列(存储过程最终写入数据库)设置为 1970-01-01,并且我作为输入传递了正确的 HH:MM:SS。这适用于我的应用程序的早期版本(我使用 JDBC lib 10.x.x.x)

如果我使用

callableStmt.setDate(6, new java.sql.Date(attributeValue.getTime()));

DD-MM-YYYY 设置正确,但小时设置为 00:00:00。

那么,调用属性并将属性传递给这个存储过程的正确方法是什么?另外,有什么调试技巧吗?

Oracle 数据库 11g 企业版 11.2.0.2.0 - 64 位生产 Oracle JDBC 库:ojdbc6-11.2.0.3

【问题讨论】:

  • 从 Oracle 10 迁移到 Oracle 11 时,Oracle 在 ojdbc6.jar 中对此进行了更改。在此之前 setTime 设置日期和时间,我猜这是一个错误。

标签: java oracle jakarta-ee stored-procedures jdbc


【解决方案1】:

尝试使用Timestamp

callableStmt.setTimestamp(6, new java.sql.Timestamp(attributeValue.getTime()));

【讨论】:

  • 我的存储过程输入被定义为“i_value in date”,所以这不起作用:执行存储过程时它说找不到它(因为类型不匹配)
  • 根据 [oracle.com/technetwork/database/enterprise-edition/…,您可能需要将 SQL DATES 映射到 java.sql.Timestamp 的 Oracle JDBC 版本。
  • 嗯,很好的线索,但我使用的是 11.2.0.3,它应该映射它,但它仍然没有......(我有 3 个具有相同名称和不同类型的存储过程最后一个 IN 参数,我得到 oracle 将 3 个过程与我的输入匹配的错误
【解决方案2】:

使用

callableStmt.setTimestamp(6, new java.sql.Timestamp(attributeValue.getTime()));

在我的存储过程重载的情况下不起作用,其中我的 3 个函数之间的唯一区别是最后一个参数:VARCHAR2、DATE 或 NUMBER。使用此代码时,我的存储过程执行失败,因为 Oracle 找不到要使用的方法。 (可能是因为 JDBC 库没有将时间戳映射到 DATE 列,正如 here 解释的那样)

它的唯一工作方式是:

callableStmt.setObject(6, new java.sql.Timestamp(attributeValue.getTime()), OracleTypes.DATE);

这似乎在保留 DD-MM-YYYY 和 HH:MM:SS 的同时强制我的时间戳到 Oracle 存储过程中的 DATE 列之间的映射。

【讨论】:

  • 请解释一下你的代码。一个简单的单行可以作为评论发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多