2012-02-27 58 views
0

我整天都在使用這個異常,現在我要瘋了,我找不到我的代碼中有什麼問題。我已檢查並重新檢查方法,但我無法找到一個孤立的,我已檢查並重新檢查日期格式,他們都很好......爲什麼這是發送month invalid例外。完整的堆棧跟蹤如下,我也發現當調用ResultSet.next()方法時,程序拋出異常。java.sql.SQLDataException:從Oracle獲取數據時的無效月份

feb 27, 2012 4:03:38 PM mx.gob.sagarpa.utilidades.Database generarReporteArchivos 
SEVERE: null 
java.sql.SQLDataException: ORA-01843: not a valid month 

     at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) 
     at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
     at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 
     at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) 
     at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
     at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
     at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193) 
     at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1108) 
     at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:373) 
     at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java: 
277) 
     at mx.gob.sagarpa.utilidades.Database.generarReporteArchivos(Database.ja 
va:160) 
     at mx.gob.sagarpa.beans.TableBean.generarReportes(TableBean.java:60) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.apache.el.parser.AstValue.invoke(AstValue.java:262) 
     at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:2 
78) 
     at org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener. 
processAjaxBehavior(MethodExpressionAjaxBehaviorListener.java:71) 
     at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent 
.java:113) 
     at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.ja 
va:106) 
     at org.ajax4jsf.component.behavior.AjaxBehavior.broadcast(AjaxBehavior.j 
ava:291) 
     at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java: 
760) 
     at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 

     at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1 
259) 
     at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicat 
ionPhase.java:81) 
     at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
     at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 

     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl 
icationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF 
ilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV 
alve.java:224) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV 
alve.java:169) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica 
torBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j 
ava:168) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j 
ava:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 
929) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal 
ve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav 
a:405) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp 
11Processor.java:964) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(
AbstractProtocol.java:515) 
     at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoin 
t.java:1824) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. 
java:1110) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor 
.java:603) 
     at java.lang.Thread.run(Thread.java:722) 

CODE

public List<RegistroReporteArchivo> generarReporteArchivos(
     int idUsuario, String nombreArchivo, 
     String fechaInicio, String fechaFin) { 
    CallableStatement cs; 
    ResultSet rs = null; 
    List<RegistroReporteArchivo> list = new ArrayList<RegistroReporteArchivo>(); 
    try { 
     connect(); 
     cs = connection.prepareCall("{call getreportearchivo(?,?,?,?,?)}"); 
     cs.setInt(1, idUsuario); 
     cs.setString(2, nombreArchivo); 
     cs.setString(3, fechaInicio); 
     cs.setString(4, fechaFin); 
     cs.registerOutParameter(5, OracleTypes.CURSOR); 
     cs.execute(); 
     rs = (ResultSet) cs.getObject(5); 
     while (rs.next()) { //The exception marks this line as the responsible !! 
      list.add(new RegistroReporteArchivo(rs.getString(1), 
        rs.getInt(2), rs.getInt(3), rs.getInt(4), 
        rs.getInt(5))); 
     } 
     disconnect(); 
    } catch (SQLException ex) { 
     Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return list; 
} 
+0

您可能想要提供程序定義。 – 2012-02-27 22:29:19

+0

你傳遞一個日期作爲一個字符串? – Venki 2012-02-27 22:31:29

+0

很可能你會以無效的字符串格式傳遞日期。 – Venki 2012-02-27 22:31:53

回答

3

什麼是getreportearchivo過程的簽名?是否聲明一個或多個參數爲DATE?如果是這樣,你應該真的叫setDate而不是setString

如果該過程的所有參數實際上都是VARCHAR2參數,那麼是否將字符串轉換爲過程中的日期?如果是這樣,TO_DATE函數中指定的格式掩碼看起來不匹配正在傳入的字符串。

+0

是的,事實上他們都是varchar2。我再次檢查過程,並且有一個'ORDER BY'子句,就像'ORDER BY to_date(fechaCarga)'一樣,我沒有按照我使用的格式格式化日期,所以只需要'ORDER BY to_date (fechaCarga,'DD/MM/YYYY')問題解決了。謝謝 ! – BRabbit27 2012-02-27 23:01:07

1

運行以下sql語句並檢查您的NLS_DATE_FORMAT。

select * from nls_session_parameters; 

輸出可能看起來像

SQL> select * from nls_session_parameters; 

PARAMETER      VALUE 
------------------------------ ---------------------------------------- 
NLS_LANGUAGE     ENGLISH 
NLS_TERRITORY     UNITED KINGDOM 
NLS_CURRENCY     £ 
NLS_ISO_CURRENCY    UNITED KINGDOM 
NLS_NUMERIC_CHARACTERS   ., 
NLS_CALENDAR     GREGORIAN 
**NLS_DATE_FORMAT    DD-MON-RR** 
NLS_DATE_LANGUAGE    ENGLISH 
NLS_SORT      BINARY 
NLS_TIME_FORMAT    HH24.MI.SSXFF 
NLS_TIMESTAMP_FORMAT   DD-MON-RR HH24.MI.SSXFF 
NLS_TIME_TZ_FORMAT    HH24.MI.SSXFF TZR 
NLS_TIMESTAMP_TZ_FORMAT  DD-MON-RR HH24.MI.SSXFF TZR 
NLS_DUAL_CURRENCY    € 
NLS_COMP      BINARY 
NLS_LENGTH_SEMANTICS   BYTE 
NLS_NCHAR_CONV_EXCP   FALSE 

17 rows selected. 

檢查所傳遞給程序的日期格式。它可能解決問題。

+0

我感謝您的幫助! – BRabbit27 2012-02-27 23:01:48