1

我正在尝试使用 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.xxx)

如果我使用

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

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

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

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64 位生产 Oracle JDBC 库:ojdbc6-11.2.0.3

4

2 回答 2

4

尝试使用Timestamp

callableStmt.setTimestamp(6, new java.sql.Timestamp(attributeValue.getTime()));
于 2013-02-20T21:10:33.720 回答
0

使用

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

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

它起作用的唯一方法是:

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

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

于 2013-02-21T00:05:47.620 回答