2

我正在从 java webapp 向 Oracle 存储过程发出请求,该存储过程恰好有一个 Timestamp IN 参数。

信息的传播方式类似于:

javaWebApp --} webservice 客户端 --} ws --} storedProcedure

我将时间戳参数作为格式化字符串从 web 服务客户端发送到 ws。

在测试环境中,它可以发送:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss a");
input.setTimestampField(dateFormat.format(new Date()));

如您所见,发送了一个格式化的字符串。但是在生产环境中,它引发了一个异常

ORA-01830: date format picture ends before converting entire input string.

它与格式不同有关,可能是由于一个 DB 与另一个 DB 的配置不同。我知道测试环境应该是生产站点的副本,但是我无法正确设置它们。尽管他们设置数据库的方式如何,我仍需要发送 Timestamp-as-a-formatted-string 字段。有任何想法吗?提前致谢。

**** 编辑****:尽管有特定的配置,我还是找到了让它正常工作的方法。就像使用适当的 Oracle 指令在 Web 服务中设置调用指令一样简单。我的意思是,对 Oracle 存储过程的调用来自

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,TO_TIMESTAMP(?, 'DD-MM-YYYY HH24:MI:SS'),?,?,?,?,?,?,?,?,?,?,?)"

虽然我在过程调用中设置的格式与 webapp 使用原始问题中所述的 SimpleDateFormat 发送的格式相匹配,但稍作修改:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

谢谢大家的帮助和想法。

4

2 回答 2

1

默认的 NLS_DATE_FORMAT 通常不包括时间,只有两位数的年份。它可能是 DD-MM-YY 或 MM-DD-YY。

如果 WS 接收到一个字符串并且数据库存储过程需要一个时间戳,那么它们两者将需要协商格式掩码。WS 在连接到数据库时应该设置明确的日期格式,或者数据库应该能够接受字符串并使用硬编码格式对其进行转换。

除非您在 WS 中定义了一些特定的协商,否则 JavaWebApp 或 WebServiceClient 将无法影响数据库假定 WS 正在使用的格式。

说了这么多,我会看看你最后的任何其他代码,看看是否有任何类似的翻译。您可能会发现使用特定格式的其他内容。

于 2010-03-25T05:40:35.503 回答
0

您的查询在input准备好的语句中是什么样的?该错误表明 Oracle 不喜欢您传入的日期格式。您的测试环境可能在正在使用的数据库或机器/驱动程序上设置了不同的 NLS_DATE_FORMAT。

于 2010-03-24T23:51:48.453 回答