我在Windows Server 2008 R2 Enterprise上的tomcat v7上运行了一个应用程序。在我的DAO类中,我正在运行一个SQL过程来获取要在前端显示的数据。
stmtforcase.executeQuery("alter session set NLS_COMP=LINGUISTIC");
stmtforcase.executeQuery("alter session set NLS_SORT=BINARY_CI");
CallableStatement cs = connection
.prepareCall("{ call STATUS_UPDATE(?,?,?,?,?,?) }");
cs.setString(1, a);
cs.setString(2, b);
cs.setString(3, c);
cs.setString(4, d);
cs.setString(5, e);
cs.registerOutParameter(6, OracleTypes.CURSOR);
cs.execute();
程序代码
BEGIN
SELECT PREVIOUS_LOAD_DT INTO H FROM LOAD_DT_TBL;
OPEN AREF FOR SELECT DT,SUM(ACTUAL_B),SUM(PREDICTED_B) FROM STATUS_UPDATE_TBL
WHERE (TO_DATE(DT,'DD-MON-YYYY') BETWEEN TO_DATE(SYSDATE-7,'DD-MON-YYYY') AND TO_DATE(H,'DD-MON-YYYY'))
AND (TM_NAME=TMNAME OR TMNAME='NULL') AND (PM_NAME=PMNAME OR PMNAME='NULL') AND (VERTICAL=VER OR VER='NULL') AND (ACCOUNT=ACC OR ACC='NULL') AND (PROJECT_NAME=PROJECTNAME OR PROJECTNAME='NULL')
GROUP BY DT
ORDER BY DT;
END ;
PREVIOUS_LOAD_DT 是varchar列。从eclipse运行时,这完全正常。没有错误。但是当我将它导出到WAR并将其部署在Tomcat服务器上时,我得到了一个
java.sql.SQLException:ORA-01843:不是有效月份
我不明白为什么会发生这种情况,因为oracle数据库和过程是相同的。 另外,当我在Windows 7企业版中执行相同操作时,没有任何问题。部署的版本就像on on eclipse一样。
尝试使用11g和10g相同的表格和程序。 任何人都可以解释这种行为吗?
使用 SYSDATE 代替 TO_DATE(SYSDATE-7,'DD-MON-YYYY')会产生同样的问题。但是像 TO_DATE('29 -OCT-2013','DD-MON-YYYY')这样的硬编码是有效的。我没有看到调用环境如何影响proc的工作,因为我没有将任何日期值传递为 IN 参数。所有基于日期的查询都来自proc。
注意:我使用varchar作为日期列,因为使用日期类型会在使用sql loader从csv加载日期时抛出错误。