2014-08-29 7 views
1

나는 다음과 같은 절차를 가지고 응용 프로그램이 있습니다은 java.sql.SQLException : ORA-01843 : 유효한 월 프로 시저를 호출

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; 

을 그리고 다음은이 프로 시저를 호출하는 자바 코드 (나 '의를) 여기 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'시도);' – ErrorNotFoundException

+0

하지만 어떻게 작동합니까? –

+0

귀하의 의견은 어쨌든 작동하지 않습니다. 그것은'선택에서 이중으로'를 요구할 것입니다. –

답변

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입니다! 이것은 다른 호스트의 플랫폼 및 세션 매개 변수에 따라 다릅니다!

예 : = ((TO_NUMBER 선택 이중에서 TO_CHAR (TO_DATE (SYSDATE, 'DD-MON-RRRR') 'RRRR'))

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

+0

OK 제 'NLS_DATE_FORMAT'은 이미 리눅스에서'DD-MON-RRRR'입니다. 그리고 어쨌든'to_date (sysdate, 'DD-MIN-RRRR')'을 사용하여 날짜를 해당 형식으로 변환하고 있으므로 충돌하는 형식으로 보지 않습니다. –

+0

@DarshanLila 예제를 추가했습니다. –

+0

하지만 sysdate를'NLS_DATE_FORMAT'과 호환되는'to_date (sysdate, 'DD-MON-RRRR')'로 이미 포맷하고 있습니다. 그러나 sqldeveloper에서 실행할 때 프로 시저가 올바르게 작동하지만 최대 절전 모드를 통해 호출하려고하면 예외가 발생합니다. –