Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Insert into table данных из ResultSet


Автор: SherbAnt 25.1.2011, 13:08
Добрый день, уважаемые.

Такая ситуация. Есть 2 базы данных от разных производителей (Teradata[1] и Derby[2]).
Нужно выполнить select запрос к первой и создать таблицу с результатом во второй. Создание таблицы я уже сделал на основе мета-информации из ResultSet. А вот с insert'ом беда. Очень многие нюансы этих двух БД не сходятся. Приходится делать кучу костылей что бы построить валидный запрос.

Может я выдумываю велосипед? Подскажите, пожалуйста, какое нибудь более менее готовое решение.

Заранее спасибо smile

Автор: LSD 25.1.2011, 14:47
Цитата(SherbAnt @  25.1.2011,  14:08 Найти цитируемый пост)
Подскажите, пожалуйста, какое нибудь более менее готовое решение.

ORM, например Hibernate.

Автор: SherbAnt 25.1.2011, 14:51
Тоже вариант, конечно. Но больно "дорогой". Вторая база по возможности должна быть embedded.  Что бы пользователь вообще не заморачивался с ее установкой и настройкой.
Похоже придется писать свой конвертор типов и значений

Автор: LSD 25.1.2011, 14:53
Цитата(SherbAnt @  25.1.2011,  15:51 Найти цитируемый пост)
Тоже вариант, конечно. Но больно "дорогой".

Тут уж сами решайте, что вам дороже - время разработчика или пара мегабайт, на библиотеки.

Автор: Temdegon 25.1.2011, 16:04
Цитата

Вторая база по возможности должна быть embedded.  Что бы пользователь вообще не заморачивался с ее установкой и настройкой.

Ну это не мешает использовать Hibernate. 
А вообще, какая может быть беда с Insert? Какие там костыли? Можете подробнее описать? По мне так prepareStatement и вперед.

Автор: SherbAnt 26.1.2011, 18:57
Костыли есть. Ну например у этих баз разный формат хранения Timestamp. Решил проблему переформатированием строки в нужный формат. Далее DerbyDB не знает про такой тип данных как TINYINT. Пришлось вставить проверку типа и возвращать INTEGER. Когда наткнулся на третье несовпадение, сработал внутренний сигнал тревоги. Понял что код обрастает костылями, и решил спросить у знающих людей smile
Hibernate использовать нельзя, так как ResultSet ко мне приходит снаружи. Я его перехватываю.

В общем, написал свой wrapper который оборачивает Type/Value входящего ResultSet'а. Хотя бы размести все костыли в одном месте. Всем спасибо за советы.
Тему я помечу как решенную, но если появятся мысли - welcome! С удовольствием перепишу этот ужас по фэншую  smile 

Автор: Temdegon 27.1.2011, 00:39
Я чего-то не понимаю, по этому и хочу разобраться, т.сказать на будущее.
Цитата

Ну например у этих баз разный формат хранения Timestamp. 

Не врубаюсь, причем здесь формат хранения. Это проблема базы данных и JDBC. Я подозреваю, вы используете
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html
У него есть метод
Код

Timestamp getTimestamp(int columnIndex) 

А http://download.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html есть метод
Код

void setTimestamp(int parameterIndex, Timestamp x) 

Какие строки? Какие форматы хранения?
Или вы SQL вместе с значениями в строку собираете?
То же самое и с TINYINT. Определилсь, что будете использовать вместо него INTEGER, ну так и делайте getInt, SetInt. 
Я с JDBC мало работал, но мне казалось что там все просто. Сейчас вот закрались сомнения, что я чего-то не догоняю  smile 

Автор: LSD 27.1.2011, 17:45
Кстати для вставки можно использовать непосредственно ResultSet.
Код

Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table");
resultSet.moveToInsertRow();
resultSet.updateString("col_string", "new data");
resultSet.insertRow();

Автор: SherbAnt 27.1.2011, 20:36
Цитата(LSD @  27.1.2011,  20:45 Найти цитируемый пост)
Кстати для вставки можно использовать непосредственно ResultSet.


Спасибо! Вот этого я не знал

Автор: Temdegon 27.1.2011, 20:56
Мммда... Мой вопрос че-то игнорят  smile 

Автор: SherbAnt 30.1.2011, 16:37
Не игнорю, просто не часто на форум захожу.


Цитата(Temdegon @  27.1.2011,  03:39 Найти цитируемый пост)
Я подозреваю, вы используете
ResultSet
У него есть метод
код Java
1:
Timestamp getTimestamp(int columnIndex) 

А PreparedStatement есть метод
код Java
1:
void setTimestamp(int parameterIndex, Timestamp x) 


Все замечательно, но как же узнать какой из методов PreparedStatement вызывать?
Входящий тип можно получить 
Код

ResulSetMetaData metaData = rs.getMetaData();
String type = metaData.getColumnTypeName(i)


Но в PreparedStatement придется либо вызывать setObject(obj) либо организовывать все тот же wrapper который я уже написал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)