gpt4 book ai didi

java - ORA-01843 : not a valid month

转载 作者:行者123 更新时间:2023-12-02 05:44:46 26 4
gpt4 key购买 nike

我想在oracle11g数据库表中插入记录。我正在从 java 调用存储过程。在执行存储过程时,我收到以下错误。

ORA-01843: not a valid month.  

我正在将日期从 String 转换为 Java 中的日期,如下所示

date=new SimpleDateFormat("MM/dd/yyyy").parse(visitDate);

在我的存储过程中,我有以下插入查询

create or replace PROCEDURE CREATE_VISIT(p_visit_date varchar2)
insert into visit(VISIT_ID,visit_date) values
(frc.SEQ_VISIT.nextval,nvl(to_date(p_visit_date, 'mm/dd/yyyy hh:mi am'),
sysdate));
END CREATE_VISIT;

最佳答案

您有一个 Java 中的 String。您可以将其转换为 Java 中的Date。到目前为止,想必一切都很好。

但是,您的过程接受 varchar2。因此,在某些时候,您构造的 Date 会被显式或隐式转换为 varchar2。您没有说明这是在哪里发生的(在 Java 中还是在 PL/SQL 中),也没有说明它是显式还是隐式完成的。如果转换是在 PL/SQL 中隐式完成的,那么将使用 session 的 NLS_DATE_FORMAT,对于同一数据库中的不同 session ,该转换可能会有所不同。在基于美国的数据库和客户端的默认安装中,这将是 DD-MON-RR

在您的过程中,您可以对使用显式格式掩码传入的字符串调用 to_date。如果传入的字符串不是 mm/dd/yyyy hh:mi am 格式,您将收到错误,或者更糟糕的是,您将收到不正确的结果(这是老问题是字符串 01/02/03 是否代表 2003 年 1 月 2 日、2003 年 2 月 1 日或 1901 年 2 月 3 日)。

如果我们猜测 Java 中的 Date 使用 session 的默认 NLS_DATE_FORMAT 隐式转换为 varchar2,即 DD- MON-YYYY,然后我们就可以看到为什么您的 to_date 转换会失败。例如,如果您的 Date 为 2014 年 5 月 30 日,则会隐式转换为字符串“30-MAY-14”。如果您随后尝试使用 to_date 和格式掩码 mm/dd/yyyy hh:mi am 将其转换回 date,Oracle会尝试将字符串中的 30 转换为月份并引发错误,因为没有第 30 个月。

实际上,您应该自始至终都使用正确的数据类型,并且应该避免像瘟疫一样的隐式强制转换。如果您将过程声明为采用 date 参数,则可以从 Java 代码中传递 Date 并在过程中省略 to_date 调用。 Date 将从 Java 传递到 PL/SQL,无需转换为 varchar2,然后再转换回 date,您就赢了不必担心确保所有格式掩码在整个代码库中保持一致。

create or replace PROCEDURE CREATE_VISIT(p_visit_date date)
AS
BEGIN
insert into visit(VISIT_ID,visit_date)
values (frc.SEQ_VISIT.nextval,nvl(p_visit_date, sysdate);
END CREATE_VISIT;

关于java - ORA-01843 : not a valid month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com