Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вставить список значений в раздел IN оператора SELECT на Java? / 14 сообщений из 14, страница 1 из 1
27.01.2005, 13:10
    #32886855
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
Здравствуйте всем.
Вопрос такой.
Есть запрос вида "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
27.01.2005, 13:25
    #32886912
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
в лоб:

массив 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
27.01.2005, 13:28
    #32886921
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
имхо, лучше оставить вложенный запрос на своем месте. Если он тяжелый - попробовать упростить.
...
Рейтинг: 0 / 0
27.01.2005, 13:35
    #32886951
concat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
Код: 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
27.01.2005, 13:37
    #32886964
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
А.Грасо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
27.01.2005, 13:53
    #32887016
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
Б 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
27.01.2005, 13:54
    #32887021
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
чё за херня? Снова:

в 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
27.01.2005, 13:56
    #32887026
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
2ponomarevvb: ты с Oracle работаешь? Если да, то можно использовать OraclePreparedStatement, в нем есть метод setARRAY(), в который можно передавать ARRAY, соответствующим образом поправив запрос.
...
Рейтинг: 0 / 0
27.01.2005, 13:57
    #32887029
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
оффтоп.
Кстати, никто не знает, почему иногда бывает интернета нет (странички не
открывает и т.д. и т.п.) но почта работает, ася работает, даже ННТП
работает? :)

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

Posted via ActualForum NNTP Server 1.1
разные вообще-то сервисы..
...
Рейтинг: 0 / 0
27.01.2005, 19:16
    #32888002
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
riman
оффтоп.
Кстати, никто не знает, почему иногда бывает интернета нет (странички не
открывает и т.д. и т.п.) но почта работает, ася работает, даже ННТП
работает? :)Дык. Ты не ассоциируй http-прокси с интернетом.
...
Рейтинг: 0 / 0
27.01.2005, 20:28
    #32888087
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
Всем большое спасибо.
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
28.01.2005, 12:23
    #32888932
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
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
28.01.2005, 16:33
    #32889871
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить список значений в раздел IN оператора SELECT на Java?
Спасибо
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вставить список значений в раздел IN оператора SELECT на Java? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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