我有一个应用程序在 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 Enterprise 中执行相同操作时,没有问题。部署的版本就像 eclipse 上的 on 一样工作。
尝试使用具有相同表和过程的 11g 和 10g。任何人都可以解释这种行为吗?
编辑
使用SYSDATE代替TO_DATE(SYSDATE-7,'DD-MON-YYYY')会出现同样的问题。但是像TO_DATE('29-OCT-2013','DD-MON-YYYY')这样的硬编码可以工作。我没有看到调用环境如何影响 proc 的工作,因为我没有将任何日期值作为IN参数传递。所有基于日期的查询都来自 proc。
注意:我使用 varchar 作为日期列,因为使用日期类型在使用 sql 加载程序从 csv 加载日期时会引发错误。