次の違いに気付きましたが、どこにも文書化されていませんでした。他の人が同じことに気づいたのか、それとも同じことを証明するいくつかのドキュメントを教えてくれるのか疑問に思っています。
Env:-
_Oracle 11g, JDK 1.6, iBatis, PL/SQL
_
シナリオ:-
ojdbc14.jar:pl/sqlがDATE
型の変数を返し、それをJava.sql.Date変数に入れようとすると、すべて正常に動作します。例:
Date annualDate = (Date) map.get("exam_date");
ojdbc6.jar:pl/sqlがDATE
型の変数を返し、それをJava.sql.Date変数に入れようとすると、例外が発生します。
_Java.lang.ClassCastException: Java.sql.Timestamp cannot be cast to Java.sql.Date
_
実際、ojdbc14.jarは実際のドライバーのバージョンについては何も言っていません( JDBC Driver Downloads を参照)、ただし、Oracle 11gより前のものです。このような状況では、正確なバージョンを提供する必要があります。
とにかく、 DATEとTIMESTAMPで何が起こっているのか? で簡単に説明が見つかると思います。要するに、それらは9.2ドライバーの動作を変更し、その後11.1ドライバーの動作を変更しました。
これはあなたが経験している違いを説明するかもしれません(そして私は最新バージョン、すなわち11.2ドライバーを使用することをお勧めします)。
これらのドライバー名の「14」と「6」は、それらが記述されたJVMを指します。まだJDK 1.4を使用している場合、深刻な問題があり、アップグレードする必要があると思います。 JDK 1.4は、サポートの有効期間を長く過ぎています。ジェネリックもありませんでした! JDK 6 u21は、Oracle/Sunの現在の生産標準です。まだ行っていない場合は、切り替えることをお勧めします。
同じ問題があります!
Oracleサイトで次のように見つかりました リンクテキスト
前述のように、11.1ドライバーはデフォルトでデータベースからの読み取り時にSQL DATEをタイムスタンプに変換します。これは常に正しいことであり、9iの変更は間違いでした。 11.1ドライバーは正しい動作に戻りました。アプリケーションでV8Compatibleを設定していなくても、ほとんどの場合、動作に違いは見られません。 getObjectを使用してDATE列を読み取ると、違いに気付くかもしれません。結果は、日付ではなくタイムスタンプになります。 TimestampはDateのサブクラスであるため、通常これは問題ではありません。違いに気付くのは、DATEからDateへの変換に依存して時間コンポーネントを切り捨てた場合、または値に対してtoStringを実行した場合です。それ以外の場合、変更は透過的でなければなりません。
何らかの理由でアプリがこの変更に非常に敏感であり、単に9i-10gの動作が必要な場合は、接続プロパティを設定できます。 mapDateToTimestampをfalseに設定すると、ドライバーはデフォルトの9i-10gの動作に戻り、DATEをDateにマップします。
また、ojdbc14からojdbc6まで、いくつかのタイプ(OracleResultSet
、OracleStatement
など)がパッケージOracle.jdbc.driver
からOracle.jdbc
。