Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PrepareStatement вставка в in выражение, как вставить набор значений? 
V
    Опции темы
integral
Дата 24.9.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



Добрый вечер!
Есть некий SQL-запрос (а точнее то что я хочу использовать через PreparedStatement), например (просто пример, не следует от него отталкиватся)
Код

SELECT m.mess, m.userid FROM messages WHERE m.userid in (?)

Каким обрахом мне сделать вставку набора интов, что бы вышло например
Код

SELECT m.mess, m.userid FROM messages WHERE m.userid in (1,5,6,7,9,12,15,17,21)

строкой не выходит...
Нужена вставка именно в in. smile 
Спасибо   smile 


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
ivg
Дата 24.9.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Код

import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

...

    public static void query1(Connection connection, int[] ids) throws SQLException {
        StringBuilder sb = new StringBuilder("SELECT m.mess, m.userid FROM messages WHERE m.userid in (");
        for (int i = 0; i < ids.length; ++i)
            sb.append(i > 0 ? ",?" : "?");
        sb.append(")");
        PreparedStatement ps = connection.prepareStatement(sb.toString());
        try {
            for (int i = 0; i < ids.length; ++i)
                ps.setInt(i+1, ids[i]);
            ResultSet rs = ps.executeQuery();
            try {
                while (rs.next()) {
                    // do something
                }
            } finally {
                try { rs.close(); } catch (SQLException ignore) { }
            }
        } finally {
            try { ps.close(); } catch (SQLException ignore) { }
        }
    }
    
    public static void query2(Connection connection, Integer[] ids) throws SQLException {
        PreparedStatement ps = connection
            .prepareStatement("SELECT m.mess, m.userid FROM messages WHERE m.userid in (?)");
        try {
            Array sqlArray = connection.createArrayOf("integer"/*db spec*/, ids);
            ps.setArray(1, sqlArray);
            ResultSet rs = ps.executeQuery();
            try {
                while (rs.next()) {
                    // do something
                }
            } finally {
                try { rs.close(); } catch (SQLException ignore) { }
            }
        } finally {
            try { ps.close(); } catch (SQLException ignore) { }
        }
    }
 Недостатки:
1-й способ: Плохие условия для кэширования запросов; в БД ограничения на кол-во параметров в запросе (в Oracle, MSSQL где-то 1000, где-то 2000)
2-й способ: JDBC 4; БД specific - код выше сгодится для PostgreSQL, для Oracle - свои заморочки, MSSQL - не прокатит(там вообще массивов/коллекций нету), можно использовать временные таблицы с предварительной вставкой, по остальным БД надо смотреть.
Ну и конечно с временными* таблицами можно, но как показывает практика второй способ для PostgreSQL и Oracle гораздо эффективнее.
Надеюсь всё остальное понятно из кода...
PM MAIL   Вверх
integral
Дата 25.9.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



спасибо, второй способ как раз то что нужен, под Оракл так и сдалал, а вот под MySql не могу найти как создать массив smile 


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.