Вход | Регистрация



Oracle Objects for OLE (OO4O) как указать несколько значений параметров в запросе с IN()

Oracle Objects for OLE (OO4O) как указать несколько значений параметров в запросе с IN()
Я
   Gluk
 
29.12.17 - 08:33
В PL/SQL Developer простой запрос отрабатывает правильно:
SELECT * FROM mytable WHERE item IN('111','222')

Использую подключение через "OracleInProcServer.XOraSession":
SELECT * FROM mytable WHERE item IN(:Items)

Если задать параметр:
Parameters.Add("Items", "111", 1)
Отрабатывает верно.

Задаю параметр:
Parameters.Add("Items", "'111','222'", 1) или Parameters.Add("Items", "111,222", 1)
Запрос ничего не возвращает.

Как правильно задать параметр?
 
 
   rphosts
 
1 - 29.12.17 - 08:40
может вторым параметром массив втыкать?
   Asakra
 
2 - 29.12.17 - 08:47
Parameters.Add("Items1", "111", 1)
Parameters.Add("Items2", "222", 1)
SELECT * FROM mytable WHERE item IN(:Items1,:Items2)
   Gluk
 
3 - 29.12.17 - 08:48
(1) подскажи как плз, не очень понимаю
   Gluk
 
4 - 29.12.17 - 08:52
(2) а если количество значения заранее не известно или их много?
   Asakra
 
5 - 29.12.17 - 08:53
(4) в цикле
   Gluk
 
6 - 29.12.17 - 09:07
(5) вариант, но не очень хороший
   NorthWind
 
7 - 29.12.17 - 09:13
(0), (2) чет мне кажется, что не получится в IN массив вставить. Я бы рассмотрел временную или постоянную таблицу, которую предварительно заполнить этими данными и потом сделать селект с условием на содержание элементов в этой таблице.
   Gluk
 
8 - 29.12.17 - 09:20
(7) попробую
   Gluk
 
9 - 29.12.17 - 09:22
еще советуют преобразовать строку параметра в таблицу

как это можно сделать?
   Asakra
 
10 - 29.12.17 - 09:24
(9) в цикле) insert
 
 Рекламное место пустует
   Asakra
 
11 - 29.12.17 - 09:25
может тогда like?
   Gluk
 
12 - 29.12.17 - 09:30
(9) не, я думаю имеется ввиду это:

WITH xx AS (
    SELECT '1,2,10,15,27,58,135' ss FROM dual)
,  yy AS (
    SELECT regexp_count(ss,',')+1 nn FROM xx)
,  zz AS (
    SELECT LEVEL mm FROM dual, yy
    CONNECT BY LEVEL <= yy.nn)
SELECT zz.mm, to_number(regexp_substr(xx.ss,'[^,]+',1,zz.mm)) RESULT
FROM xx, zz
ORDER BY 1;

но не понимаю как это работает
   Gluk
 
13 - 29.12.17 - 09:31
(11) like как тут использовать?
   Asakra
 
14 - 29.12.17 - 09:34
(12) может так: SELECT * FROM mytable WHERE item IN("+СтрокаПараметров+")
(13) как-то так: SELECT * FROM mytable WHERE ("+СтрокаПараметров+") like '%'+item+'%'
   Asakra
 
15 - 29.12.17 - 09:35
SELECT * FROM mytable WHERE '"+СтрокаПараметров+"' like '%'+item+'%'
   Asakra
 
16 - 29.12.17 - 09:37
СтрокаПараметров = "'111','222'";
   Asakra
 
17 - 29.12.17 - 09:37
а для like просто "111,222"
   Asakra
 
18 - 29.12.17 - 09:39
я бы так делал IN("+СтрокаПараметров+")
   NorthWind
 
19 - 29.12.17 - 10:16
(18) Можно, но есть нюанс. Я сталкивался с тем, что у некоторых СУБД есть ограничения на количество значений в списке IN (). В частности, встречалась цифра 255 или 256. Поэтому если там может быть реально много данных, то верный вариант - таблица для хранения этих значений и выборка с ней.
   Asakra
 
20 - 29.12.17 - 10:23
(19) а почему не проверить, как с этим дела у oracle?
   Asakra
 
21 - 29.12.17 - 10:26
(19) задача же "указать несколько значений параметров в запросе с IN" ))
сколь там этих значений автор не уточняет...
   NorthWind
 
22 - 29.12.17 - 10:31
мое дело предупредить, а там автору виднее, пусть уточняет
   Gluk
 
23 - 29.12.17 - 14:01
(18) сработало, спасибо
   Gluk
 
24 - 29.12.17 - 14:02
(19) "максимальное число выражений в списке - 1000"
   Вафель
 
25 - 29.12.17 - 14:22
(23) передавать параметры через строку несекурно
https://xkcd.ru/i/327_v1.png
   Gluk
 
26 - 29.12.17 - 14:24
(25) просвети плз
   Вафель
 
27 - 29.12.17 - 14:26
(26) Картинку посмотри )))
   Gluk
 
28 - 29.12.17 - 14:26
(27) я про экранирование и спросил
   DES
 
29 - 29.12.17 - 14:55
(28) что такое "экранировать" ?
   Gluk
 
30 - 29.12.17 - 14:59
(29) сказать интерпретатору, что специальные символы не использовать как специальные
   dk
 
31 - 29.12.17 - 15:03
(9) если не нравится большое количество элементов в IN
то можно эти элементы запихнуть во временную таблицу и перестроить IN (SELECT VAL from #mytemp)
Хотя есть мнение что inner join быстрее чем in отработает
   Gluk
 
32 - 29.12.17 - 15:22
(31) прав нет на это


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует