我正在从 java webapp 向 Oracle 的存储过程发出请求,该存储过程恰好有一个 Timestamp IN 参数。
信息传播的方式是这样的:
javaWebApp --} web服务客户端--} ws --} storedProcedure
然后我将时间戳参数作为格式化字符串从网络服务客户端发送到 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.
这与格式不一样有关,可能是由于一个数据库与另一个数据库的配置不同所致。我知道测试环境应该是生产站点的副本,但我无法正确设置它们。而且我需要发送 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");
感谢大家的帮助和想法。
最佳答案
默认的 NLS_DATE_FORMAT 通常不包括时间,只有两位数的年份。它可能是 DD-MM-YY 或 MM-DD-YY。
如果 WS 接收到一个字符串,而数据库存储过程需要一个时间戳,那么它们两者将需要协商格式掩码。要么 WS 在连接到数据库时应设置明确的日期格式,要么数据库应能够接受字符串并使用硬编码格式对其进行转换。
除非您在 WS 中定义了一些特定的协商,否则 JavaWebApp 或 WebServiceClient 将无法影响数据库假定 WS 使用的格式。
总而言之,我会查看您这边的任何其他代码,看看是否有任何类似的翻译。您可能会找到其他使用特定格式的内容。
关于java - 如何将时间戳字段发送到 Oracle 存储过程。尽管数据库配置来自 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2510142/