java.sql.SQLException: ORA-01843: недопустимый месяц при вызове процедуры

1

У меня есть приложение, которое имеет следующую процедуру:

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 указан в процедуре.

  • 1
    Попробуйте year_in := (select to_number(to_char(to_date(sysdate,'DD-MON-RRRR'),'RRRR')) from dual);
  • 0
    Но почему это работает на Windows, а не в Linux?
Показать ещё 1 комментарий
Теги:
spring
hibernate
sysdate

1 ответ

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

  • 0
    ОК, мой NLS_DATE_FORMAT уже является DD-MON-RRRR в Linux. И в любом случае я конвертирую свою дату в этот формат, используя to_date(sysdate,'DD-MIN-RRRR') , поэтому я не вижу в этом конфликтующих форматов.
  • 0
    @DarshanLila Я добавил пример.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню