Отображение между типами SQL и типами JDBC в Oracle немного сложнее, особенно для типов SQL DATE
и TIMESTAMP
.
База данных Oracle позволяет хранить информацию о метках времени в столбцах DATE,что совершенно противоречит определению DATE в стандарте SQL.До версии 9.2, когда была введена поддержка столбцов TIMESTAMP, Statement.setTimestamp
работало бы для столбцов DATE.Начиная с 9.2 и до 11.1 драйвер JDBC отображал тип SQL DATE
на JDBC Date
, а тип SQL TIMESTAMP
на JDBC Timestamp
.Возможные решения для хранения меток времени с использованием драйверов 10.2 JDBC перечислены в Oracle JDBC FAQ и воспроизводятся здесь:
Существует несколько способов решения этой проблемы в 9.2.через драйверы 10.2:
Измените ваши таблицы, чтобы использовать TIMESTAMP вместо DATE.Это, вероятно, редко возможно, но это лучшее решение, когда оно есть.
Измените ваше приложение, чтобы использовать defineColumnType для определения столбцов как TIMESTAMP, а не DATE.Есть проблемы с этим, потому что вы действительно не хотите использовать defineColumnType, если вам не нужно (см. Что такое defineColumnType и когда я должен его использовать?).
Измените приложение для использованияgetTimestamp, а не getObject.Это хорошее решение, когда это возможно, однако многие приложения содержат общий код, основанный на getObject, поэтому это не всегда возможно.
Установить свойство соединения V8Compatible.Это говорит драйверам JDBC использовать старое отображение, а не новое.Вы можете установить этот флаг либо как свойство соединения, либо как системное свойство.Вы устанавливаете свойство соединения, добавляя его в объект java.util.Properties, передаваемый DriverManager.getConnection или OracleDataSource.setConnectionProperties.Вы устанавливаете системное свойство, включив параметр -D в командной строке Java.
java -Doracle.jdbc.V8Compatible = "true" MyApp
Вы также можете использовать драйверы JDBC 11.1 (они будут работать с экземпляром 10g), и в FAQ есть следующее:
Oracle JDBC 11.1 решает эту проблему.Начиная с этого выпуска драйвер по умолчанию сопоставляет столбцы SQL DATE с java.sql.Timestamp.Нет необходимости устанавливать V8Compatible для получения правильного сопоставления.Совместимость с V8 настоятельно не рекомендуется.Вы не должны использовать это вообще.Если вы установите значение true, это ничего не повредит, но вы должны прекратить его использование.