Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Список ИД из строки  [new]
kaldorey
Member

Откуда:
Сообщений: 600
Есть веб-страница, из нее по методу POST передать список ID для операции над нужными записями. Насколько мне известно, этот список можно передать только как param='id1,id2,id3...'. Процедура в Оракле принимает этот запрос, и тут возник вопрос. Хотелось какой-то аналог split в Оракле, но с наскока не нашел такого, UNPIVOT читать было трудно, сложнопонимаемо(для меня), но, кажется, немного не то. Видел в инете рецепт от дяди Тома 2007 года. Это подходит, но может есть способ попроще? Мои версии:
1) версия использования курсорной переменной, что-то вроде
cur sys_refcursor;
t1 tab1%rowtype;
.....
open cur for 'select * from tab1 hwere id in('||param||')';
loop
  fetch cur into t1;
/*операции с данными*/


2) Создать колекцию, и по версии Тома разбить строку булкой в эту коллекцию. а потом уже FOR по неявному курсору и фильтру по коллекции.

Может есть что-то иное? Версия оракла 11.
25 июн 13, 14:12    [14480175]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
123йй
Member

Откуда:
Сообщений: 1637
kaldorey,
тута и по ссылкам
25 июн 13, 14:37    [14480357]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
kaldorey
...Насколько мне известно, этот список можно передать только как param='id1,id2,id3...'.

xml, json etc
25 июн 13, 14:53    [14480517]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
kaldorey
Member

Откуда:
Сообщений: 600
Максим Н, спасибо, завтра поизучаю этот момент))))

123йй , красненький синенький текст читаем, синенький бесполезный создаем, черный игнорируем.

Пока что написал так, мне показалось так проще всего. Какой способ быстрее, незнаю, если кто знает - скажите.

select *
from tab1
where id in(select to_number(regexp_substr( str
                       , '([[:digit:]])+'
                       , 1
                       , level ))
     from (select ' 716,715,714,23,34,45' str
             from dual) t
connect by regexp_substr( str
                       , '([[:digit:]])+'
                       , 1
                       , level )
            is not null)
25 июн 13, 15:37    [14480959]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
kaldorey,
проще передать коллекцию. так как между post и pl\sql есть еще средний слой, который и должен объяснить ораклу про коллекции... но не все эти средние слои такие умные...
25 июн 13, 15:40    [14480985]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18342
kaldorey
мне показалось так проще всего.

Теперь пора включить моск и ответить самому себе на вопрос: а сколько чисел можно передать в запрос таким образом?
25 июн 13, 15:40    [14480990]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
kaldorey,

конечно, есть еще варианты. баян - тема.
имхо, главный вектор для мысли - уходите от in (список) и динамический эскуэль тут не надобен.
25 июн 13, 15:47    [14481056]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
kaldorey
Member

Откуда:
Сообщений: 600
andrey_anonymous,

Я не знаю, сколько можно передать, потому и спросил выше. В моем конкретном случае больше 50 значений не будет передаваться за раз, и не более 200 раз в минуту в пике. При этом количестве сервер чувствует себя замечательно.

Orawish, а почему надо уходить от in(списка)? Нигде не нашел на эту тему. Вот здесь бы не помешала ссылка по теме.

Vint, этот слой вообще ничего не умеет, просто транслятор, насколько я мог заметить.
26 июн 13, 06:58    [14483589]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
kaldorey

..
Orawish, а почему надо уходить от in(списка)? Нигде не нашел на эту тему. Вот здесь бы не помешала ссылка по теме.
..

было, было. и немало.
например, совсем недавно мусолили тему про предельные размеры для текста sql-запросов как раз в связи с желанием отдельных граждан засунуть список значений в
ляля in () or ляля in ()..
26 июн 13, 13:11    [14485835]     Ответить | Цитировать Сообщить модератору
 Re: Список ИД из строки  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
kaldorey,
каким местом ты думаешь? "просто" трансляторы умеют работать с коллекциями, "просто" у тебя нет желания почитать документацию, и ты придумываешь очередной велотренажер для гонок формулы1.
26 июн 13, 13:31    [14486036]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить