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

发布于 2024-08-26 06:08:56 字数 1201 浏览 4 评论 0原文

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

信息传输的方式类似于:

javaWebApp --} webservice client --} ws --} storeProcedure

我将时间戳参数作为格式化字符串从 webservice 客户端发送到 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.

它与格式不相同有关,可能是由于一个数据库与另一个数据库的配置不同所致。我知道测试环境应该是生产站点的副本,但正确设置它们并不在我手中。不管他们设置数据库的方式如何,我都需要发送时间戳作为格式字符串字段。有什么想法吗?提前致谢。

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

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

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

而我在过程调用中设置的格式与 web 应用程序使用原始问题中所述的 SimpleDateFormat 发送的格式匹配,稍作修改:

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

谢谢大家的帮助和想法。

I'm making a request from a java webapp to an Oracle' stored procedure which happens to have a Timestamp IN parameter.

The way info travels is something like:

javaWebApp --} webservice client --} ws --} storedProcedure

And I send the Timestamp param as a formatted string from the webservice client to the ws.

In the testing environment, it works sending:

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

As you see, a formatted string is sent. But in the production environment, it raises an exception

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

It relates to the format not being the same, possibly due to differences in configuration from one DB to the other. I know the testing environment should be a replica of the production site, but it is not in my hands to set them properly. And I need to send the Timestamp-as-a-formatted-string field despite the way they setup the database. Any ideas? Thanks in advance.

**** EDIT ****: I've found the way to make it work properly despite the particular configuration. It is as simple as setting the call instruction in the web service with the appropiate Oracle instructions. I mean, the calling to the Oracle stored procedure went from

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

to

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

while the format I set in the procedure calling matches the format sent by the webapp using the SimpleDateFormat stated in the original question, slightly modified:

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

Thank you all for the help and the ideas.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

佞臣 2024-09-02 06:08:56

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

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

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

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

The default NLS_DATE_FORMAT generally doesn't include the time and only a two-digit year. It is probably either DD-MM-YY or MM-DD-YY.

If the WS receives a string and the database stored procedure needs a timestamp, then the two of them will need to negotiate the format mask. Either the WS, when it connects to the database, should set an explicit date format, or the database should be able to accept a string and convert it using a hard-coded format.

Unless there is some particular negotiation you have defined in the WS, nothing the JavaWebApp or WebServiceClient will be able to influence the format that the database assumes the WS is using.

All that said, I'd have a look around any other code at your end and see if there's anything doing a similar translation. You may find something else using a specific format.

薄荷→糖丶微凉 2024-09-02 06:08:56

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

What does your query look like in the input prepared statement? That error indicates that Oracle doesn't like the date format you have passed in. Your test environment may have a different NLS_DATE_FORMAT set on the database or machine/driver being used.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文