seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

Oracle8iからOracle9iへ

Weblogic6.1からWeblogic8.1へバージョンアップ。ついでにエンドオブサービスとなるOracle8iも、Oracle9iに移行。
私の担当分はうまい具合に多少の修正だけで移行できたが、他社では相当苦労しているそう。


当初、Oracle9iにTimestampカラム型ができたので、Dateは年月日、Timestampは年月日時分秒と使いわけようという案がでる。Oracle8iではDateカラムは JDBCではTimestamp型にマップされ、XOpen型もTIMESTAMPと認識された。Oracle9iではJDBCでTimestamp型とマップされるのはTimestampカラムであり、
DateカラムのXOpen型はDATEになる。
つまり、マッピングが変っている。

カラム oracle8i oracle9i
DATE TIMESTAMP DATE
TIMESTAMP -- TIMESTAMP


おまけに、Oracle8iのドライバでは、クエリーでもどされたDATEカラムをResultSet#getString()で取得するとjava.sql.Timestamp型の文字表現と同じ、「yyyy/mm/dd hh:mi:ss.ffff」型式の文字列が帰ってくる。ところが、Oracle9iでTimestampカラムを文字列で取得すると、java.sql.Timestampと合致しない標記としてかえされる。(おまけにgetObject()で取得すると、java.sql.Timestampではなく、oracle.sql.Timestamp型がかえる。これはjava.sql.Timestamp型の派生クラスではなく交換性はない。)
getBigDecimalで取得すると精度まで判定されるため、文字列表現の変換してから型をあわせるのが常套であるが、これを簡略化しでResultSetから全てのカラムを直接にgetStringして、valueOf(String)などで型にあわせたオブジェクトをつくろうとしていると、ハマル。
XOpenの型でjava.sql.Timestamp/java.sql.Dateをきちんと識別していても影響を受ける。
つまり、どうやってもマッピングが変更されている以上、実行時にマッピングをみていた部分は影響をうけてしまうのだ。
これはOracle9iのJDBC仕様違反ではないところも痛い。

また、SQLのクエリでDate型の暗黙の型変換に頼っていた演算は、このカラムをTimestampに変更すると影響をうける。JDBCのカラムアクセスなどよりも影響が広範囲にわたり、影響の有無を調査するだけでもたいへんなことである。暗黙の型変換など手抜きをするのは作法としてどうかと思うが、『Timestamp型はDate型の拡張である』とマニュアルに書いているわりに互換性がないのはいかがなものか。