powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вставить список значений в раздел IN оператора SELECT на Java?
14 сообщений из 14, страница 1 из 1
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32886855
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем.
Вопрос такой.
Есть запрос вида "select ... where id in (вложенный запрос)".
Вложенный запрос довольно тяжёлый, поэтому его результаты (массив int[] или список из Integer, не знаю, как лучше) хранятся отдельно - в массиве или списке.
Как мне сделать вещь типа такой:
Код: plaintext
1.
2.
3.
4.
 int [] ids = getIds(); // List ids = getIds();
String sql = "select ... where id in (?)";
PreparedStatement st = conn.prepareStatement(sql);
st.setXXX( 1 , ids); // Вот как вот здесь написать???
Можно что-то сделать, кроме как формировать строку where id in (?, ?...) с числом параметров равным длине ids, а потом в цикле вставлять setInt(i, ids )?
Заранее спасибо.
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32886912
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в лоб:

массив int[] - в строку типа:

int[] a = {1, 3, 5, 6}; => String s = "1, 3, 5, 6"

далее
String qry = "select ... where a in (" + s + ")";
ResultSet rs = {something}.executeQuery(qry);


--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32886921
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, лучше оставить вложенный запрос на своем месте. Если он тяжелый - попробовать упростить.
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32886951
concat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
 int [] a = { 1 ,  3 ,  5 ,  6 }; => String s = "1, 3, 5, 6"

далее
String qry = "select ... where a in (" + s + ")";
если используется oracle, то число параметров не должно превышать 1000, иначе оракл выдаст ошибку ORA-01795:
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32886964
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™в лоб:

массив int[] - в строку типа:

int[] a = {1, 3, 5, 6}; => String s = "1, 3, 5, 6"

далее
String qry = "select ... where a in (" + s + ")";
ResultSet rs = {something}.executeQuery(qry);


--
Lacrima Mosa Est

Многие драйвера вполне поддерживают и подстановку строковых параметров в скомпилированные операторы. Что-то вроде:
PreparedStatement pst = connect.PrepareStatement("...where id in (?)");
pst.setString(1, "1,2,3,4,5,6,7");
ResultSet rs = pst.executeQuery();
нормально отрабатывает. Хотя и не со всеми драйверами и СУБД.
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32887016
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Б in (?...) ЛМНЦН ГМЮВЕМХИ МЕ БЯРЮБХЬЭ. кСВЬЕ ДЕКЮРЭ РЮЙ:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with temp_table (id) as //ЯНГДЮЕРЯЪ БПЕЛЕММЮЪ РЮАКХЖЮ, МН ЩРН ДКЪ DB2, ДКЪ
нПЮЙКЮ МЕ ГМЮЧ ЙЮЙ.
(values ( 1 )
   ,( 2 )
   ,( 3 )
    ....
)
select *
from your_table
where your_table.id in (select id from temp_table)
мС Ю БПЕЛЕММСЧ РЮАКХЖС ГЮОНКМЪРЭ ОПНЦПЮЛЛМН.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32887021
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё за херня? Снова:

в in (?...) много значений не вставишь. Лучше делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with temp_table (id) as //создается временная таблица, но это для DB2, для
Оракла не знаю как.
(values ( 1 )
   ,( 2 )
   ,( 3 )
    ....
)
select *
from your_table
where your_table.id in (select id from temp_table)
Ну а временную таблицу заполнять программно.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32887026
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ponomarevvb: ты с Oracle работаешь? Если да, то можно использовать OraclePreparedStatement, в нем есть метод setARRAY(), в который можно передавать ARRAY, соответствующим образом поправив запрос.
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32887029
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтоп.
Кстати, никто не знает, почему иногда бывает интернета нет (странички не
открывает и т.д. и т.п.) но почта работает, ася работает, даже ННТП
работает? :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32887135
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
riman
оффтоп.
Кстати, никто не знает, почему иногда бывает интернета нет (странички не
открывает и т.д. и т.п.) но почта работает, ася работает, даже ННТП
работает? :)

Posted via ActualForum NNTP Server 1.1
разные вообще-то сервисы..
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32888002
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
riman
оффтоп.
Кстати, никто не знает, почему иногда бывает интернета нет (странички не
открывает и т.д. и т.п.) но почта работает, ася работает, даже ННТП
работает? :)Дык. Ты не ассоциируй http-прокси с интернетом.
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32888087
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо.
2 А.Грасоff™, concat - я плакал, что ж я так торможу
Denis Popov2ponomarevvb: ты с Oracle работаешь? Если да, то можно использовать OraclePreparedStatement, в нем есть метод setARRAY(), в который можно передавать ARRAY, соответствующим образом поправив запрос.
А как создавать этот ARRAY? По докам что-то не могу разобраться:
Код: plaintext
1.
2.
ARRAY(ArrayDescriptor type, java.sql.Connection conn, java.lang.Object elements) 
          Constructor.
Как сделать ArrayDescriptor и что есть elements?
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32888932
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponomarevvb
А как создавать этот ARRAY? По докам что-то не могу разобраться:


1. Поищи на форуме по setARRAY . Если база создана не в юникоде, могут быть проблемы с представлением VARCHAR'ов, но в твоем случае это м.б. несущественно, т.к. передаются только числа.

2. Вот и FAQ пригодился;)

3. Код для Oracle:

Код: plaintext
1.
2.
3.
4.
create or replace type t_id as object ( id number( 38 ) )
/
create or replace type tbl_id as table of t_id
/

Java:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 public   class  PreparedStructTest {

   private   static   final  String T_ID = "T_ID";
   private   static   final  String TBL_ID = "TBL_ID";

   private   static   final  String USERNAME = "scott";
   private   static   final  String PASSWORD = "tiger";
   private   static   final  String URL = "jdbc:oracle:thin:@<host>:<port>:<SERVICE_NAME>";

   public   static   void  main(String[] args)
     throws  SQLException {
    DriverManager.registerDriver( new  oracle.jdbc.OracleDriver());
    // Коннект к Oracle.
    Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    OraclePreparedStatement st = (OraclePreparedStatement) con.prepareStatement(
      "select e.*\n" +
      "from scott.emp e\n" +
      "where e.empno in (\n" +
      "  select id from table(cast(? as tbl_id))\n" +
      ")"
    );

     int [] emps = { 7369 ,  7499 };
    ARRAY array = getIntArray(con, emps);
    st.setARRAY( 1 , array);
    ResultSet rs = st.executeQuery();
     while  (rs.next()) {
      System.out.println(rs.getString("empno") + " " + rs.getString("ename"));
    }
    rs.close();
    st.close();
    con.close();
  }

   public   static  ARRAY getIntArray(Connection con,  int [] values)
     throws  SQLException {
    // Declare two descriptors, one for the ARRAY TYPE and one for the OBJECT TYPE.
    StructDescriptor structDesc = StructDescriptor.createDescriptor(T_ID, con);
    ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(TBL_ID, con);

    // Initialize the Input array object - to an array of STRUCT Objects.
    ArrayList pArrayList =  new  ArrayList();
     if  (values !=  null ) {
      // Declare the Object arrays that will store the data.
      Object[] pRecord =  new  Object[ 1 ];
      // Create the STRUCT objects to associate the host objects with the database records.
       for  ( int  i =  0 ; i < values.length; i++) {
        pRecord[ 0 ] =  new  Integer(values[i]);
        pArrayList.add( new  STRUCT(structDesc, con, pRecord));
      }
    }
    // Set up the ARRAY object.
    ARRAY pARRAY =  new  ARRAY(arrayDesc, con, pArrayList.toArray());
     return  pARRAY;
  }

}
...
Рейтинг: 0 / 0
Как вставить список значений в раздел IN оператора SELECT на Java?
    #32889871
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вставить список значений в раздел IN оператора SELECT на Java?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]