java - 如何将时间戳字段发送到 Oracle 存储过程。尽管数据库配置来自 Java?

标签 java oracle stored-procedures ora-01830

我正在从 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/

相关文章:

sql - 如何在存储过程中使用名称求和和分组?

java - JFileChooser 未显示

java - Java 上的垃圾问题太多

java - 如何格式化货币金额中的小数点后两位?

sql - 在 SQL Server 存储过程中使用 IF 语句

sql - 使用 PetaPoco 执行参数化存储过程

java - 更容易部署的 Ant 任务

oracle - 如何在 oracle 11G 中分隔逗号分隔值

oracle - Oracle 中的家谱查询

SQL。 Oracle如何引用复合主键?