0

我有一个应用程序在 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 加载日期时会引发错误。

4

0 回答 0