読者です 読者をやめる 読者になる 読者になる

argius note

プログラミング関連

開発しています



OracleJDBCのgetObjectでDATE型をjava.sql.Timestampとして取得

database Java

OracleのDATE型は時刻情報を保持しますが、ResultSet.getObject()で取得すると、(たぶん9i,10gでは)java.sql.Dateにマッピングされ、時刻が切り捨てられてしまいます。ResultSet.getTimestamp()なら日時を取得できますので、これを使えるのであればあっさり解決です。しかし、この奇妙な動作のためにプログラムをいじりたくないので、頭を悩ませていました。
この問題を回避する情報がいくつか見つかったので、書いておきます。

V8Compatible

Oracle9iから、"V8Compatible"というプロパティが使えるようになりました。これを設定すれば、DATE型をjava.sql.Timestampとして取得することができます。

java -Doracle.jdbc.V8Compatible=true ...

ただし、これだとsetObjectは上手くいきません。他の部分も「Oracle8i互換」な箇所があるかもしれないので、多少の不安が残ります。

mapDateToTimestamp

Oracle11gからは、Oracle8iとの互換性をサポートをしなくなり、"V8Compatible"は廃止されました。
その代わり、"mapDateToTimestamp"(デフォルト=true)というシステムプロパティが導入され、OracleのDATE型がTimestampにマッピングされるようです。
残念ながら、こちらで試せる環境が無いので未確認ですが、サーバがOracle9,10でも使えるみたいです。おそらく、setObjectも上手くいくでしょう。

その他

java.sql.Connection.setTypeMapで型のカスタムマッピングができるはずですが、どうにも上手くいきません。
バイトコードライブラリで強引にgetTimestamp()させるとか。