【问题标题】:java.sql.SQLException: ORA-01843: not a valid month when calling a procedurejava.sql.SQLException: ORA-01843: 调用过程时月份无效
【发布时间】:2014-09-01 17:03:39
【问题描述】:

我的申请程序如下:

procedure get_full_data (list OUT sys_refcursor,id in number, 
                                   code in varchar2,type in varchar2) is
      year_in number;                                
begin
    year_in := to_number(to_char(to_date(sysdate,'DD-MON-RRRR'),'RRRR')); // line 628
        open list for
        select * from my_tab 
        where code_present = code AND to_number(substr(year,1,4)) in (year_in,year_in-1,year_in-2)
        and minth in(select max(month) from my_tab where code_present = code
                         and to_number(substr(year,1,4)) in (year_in,year_in-1,year_in-2)
                         group by substr(year,1,9))
        order by to_number(substr(year,1,4)) desc;
END get_full_data;

这是调用此过程的 Java 代码(我在这里使用hibernate):

List<MyBean> salesApproval=session.getNamedQuery("get_data").setInteger("id",my_id).setString("code",my_code).setString("type",my_type).list();

MyBean是保存过程返回数据的类。

问题:
当我在 windows 系统上托管我的应用程序时,它可以正常工作并获得所需的结果。
但是,当我在 Linux Ubuntu 12.04 上托管我的应用程序时,它会出现以下错误:

java.sql.SQLException: ORA-01843: not a valid month
ORA-06512: at "db.proc_pack", line 628

程序中提到了第 628 行。

【问题讨论】:

  • 试试year_in := (select to_number(to_char(to_date(sysdate,'DD-MON-RRRR'),'RRRR')) from dual);
  • 但是为什么它在windows上运行而不在linux上运行呢?
  • 您的评论无论如何都不起作用。它需要select ... into from dual

标签: java spring oracle hibernate sysdate


【解决方案1】:
year_in := to_number(to_char(sysdate,'RRRR')); // line 628

SYSDATE 已经返回日期,所以TO_DATE() 转换出错..

要了解错误的原因.. TO_DATE(SYSDATE,'...') 将变为 TO_DATE('Date in Default Format','YOUR FORMAT'); 因此,出错的可能性更大..

您的默认格式将是您会话的NLS_DATE_FORMAT!这取决于不同主机中的平台和会话参数!

示例:

SQL> SELECT value FROM   nls_database_parameters WHERE  parameter = 'NLS_DATE_FORMAT';

VALUE
--------------------------------------------------------------------------------
DD-MON-RR

SQL>  select to_date(sysdate,'MON-DD-RR') from dual;
 select to_date(sysdate,'MON-DD-RR') from dual
                *
ERROR at line 1:
ORA-01843: not a valid month

SQL> ALTER SESSION SET nls_date_format = 'MON-DD-RR';

Session altered.

SQL> select to_date(sysdate,'MON-DD-RR') from dual;

TO_DATE(S
---------
AUG-29-14

Oracle Document Reference

【讨论】:

  • 好的,我的 NLS_DATE_FORMAT 在 Linux 上已经是 DD-MON-RRRR。无论如何,我正在使用to_date(sysdate,'DD-MIN-RRRR') 将我的日期转换为该格式,所以我不认为它是冲突格式。
  • @DarshanLila 我添加了一个示例。
  • 但是我已经将 sysdate 格式化为to_date(sysdate,'DD-MON-RRRR'),它与NLS_DATE_FORMAT 兼容。但是,当我从 sqldeveloper 执行它时,该过程工作正常,但当我尝试通过休眠调用它时会产生异常。
  • @DarshanLila TO_DATE() 接受字符串并将日期转换为某种格式。所以这里不需要你的 to_date() 转换。 SYSDATE 已经是一个日期。以及我上面解释的错误原因。您需要在 jdbc 或任何地方ALTER your NLS_DATE_FORMAT..如果您希望它始终如一地工作。
  • 你怎么知道的?我添加了更多输出样本!在java和sql developer中是不同的。也许,您正在检查 sql developer 并假设它在 java 中是相同的?
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2021-11-06
  • 2012-05-13
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多