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 列です。これは、日食から実行しているときに完全に正常に実行されます。エラーなし。しかし、それをWARにエクスポートしてTomcatサーバーにデプロイすると、
java.sql.SQLException: ORA-01843: 有効な月ではありません
Oracle データベースと手順が同じであるため、なぜこれが発生するのかわかりません。さらに、Windows 7 Enterprise でも同じことをしても問題ありません。デプロイされたバージョンは、Eclipse の場合と同じように機能します。
同じテーブルと手順で 11g と 10g を使用してみました。誰でもこの動作を説明できますか?
編集
TO_DATE(SYSDATE-7,'DD-MON-YYYY') の代わりにSYSDATEを使用すると、同じ問題が発生します。ただし、 TO_DATE('29-OCT-2013','DD-MON-YYYY') のようなハードコーディングは機能します。日付値をINパラメータとして渡していないため、呼び出し環境がprocの動作にどのように影響するかわかりません。すべての日付ベースのクエリは、proc 内からのものです。
注:日付型を使用すると、SQLローダーを使用してcsvから日付をロードするときにエラーがスローされるため、日付列にvarcharを使用しています。