CftClub.ru
Клуб специалистов ЦФТ-Банк

перебор по множеству

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Gobur
Профи


Вступление в Клуб: 06.11.2012
СообщениеЧт Апр 05, 2018 10:01   перебор по множеству Ответить с цитатой
Полезность: Нет оценки
Как без таблицы можно быстро обработать множество значений (например 'Иванов', 'Петров', 'Сидоров'..) в цикле?
Или проще все же куда то во временную таблицу загнать?
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеЧт Апр 05, 2018 11:15    Ответить с цитатой
Полезность: Нет оценки
Подробней можно ?
В чём находится множество ?
Что имеется ввиду под обработать?
Gobur
Профи


Вступление в Клуб: 06.11.2012
СообщениеЧт Апр 05, 2018 11:24    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
Подробней можно ?
В чём находится множество ?
Что имеется ввиду под обработать?


Да в итоге скопировал набор этих записей в файл и сделал обработку проходом по файлу.

Но в целом интересно без файла или таблицы существует возможность сформировать такой список в Oracle даже просто на pl/sql?
Типа in ('dd','ff') - это моя отсебятина.
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Апр 05, 2018 11:41    Ответить с цитатой
Полезность: Нет оценки
Можно наверное в длинную строку все засунуть с каким-то разделителем и потом в цикле дергать информацию до разделителя. Ну и там аккуратно в цикле позицию определять с какой следующий поиск делать. Или строку укорачивать с позиции разделителя+1.
В ЦФТ не знаю - это больше из классического программирования.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Апр 05, 2018 13:21   Re: перебор по множеству Ответить с цитатой
Полезность: Нет оценки
Gobur пишет:
Как без таблицы можно быстро обработать множество значений (например 'Иванов', 'Петров', 'Сидоров'..) в цикле?
Или проще все же куда то во временную таблицу загнать?


я такую задачу сравнения решал через table of или varray строк.

пихаешь туда потом в цикле сравниваешь
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Апр 05, 2018 14:23    Ответить с цитатой
Полезность: 4
Так можно
Код:
(select trim(REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1))
in dual%rowtype
connect by REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1) is not NULL)
Gobur
Профи


Вступление в Клуб: 06.11.2012
СообщениеЧт Апр 05, 2018 15:56    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Так можно
Код:
(select trim(REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1))
in dual%rowtype
connect by REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1) is not NULL)


во, что то подобное искал. Спасибо.
Gobur
Профи


Вступление в Клуб: 06.11.2012
СообщениеЧт Апр 05, 2018 15:57   Re: перебор по множеству Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
Gobur пишет:
Как без таблицы можно быстро обработать множество значений (например 'Иванов', 'Петров', 'Сидоров'..) в цикле?
Или проще все же куда то во временную таблицу загнать?


я такую задачу сравнения решал через table of или varray строк.

пихаешь туда потом в цикле сравниваешь


вопрос как раз в том , как туда пихнуть большой список без лишних телодвижений.
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеПт Апр 06, 2018 08:26    Ответить с цитатой
Полезность: 3
Gobur пишет:
Volod пишет:
Так можно
Код:
(select trim(REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1))
in dual%rowtype
connect by REGEXP_SUBSTR('405,406,407','(+[^,]+)',1,LEVEL,'i',1) is not NULL)


во, что то подобное искал. Спасибо.

Элегантно, но не везде применимо. Я имею в виду человеческий ресурс - не все любят регулярки.
Вот два простых решения, пусть и не таких элегантных.
раз:
Код:

pragma include(::[REPS_DATA].[SLIB_STR_PAPAM]);
public procedure test is
   vTmp varchar2(4000) := 'ИВАНОВ#ПЕТРОВ#СИДОРОВ';
begin
   for(
      select x(&GetValue(vTmp, '#', rownum)   :c_fio
      ) in ::[AC_FIN] all
      where   rownum <= 1+length(vTmp)-length(replace(vTmp, '#', ''))
   ) loop
      debug_pipe('x.c_fio = {'||x.c_fio||'}', 0);
   end loop;
end;


два:
Код:

type vstr is varray(0) of varchar2;
public procedure test is
   v vstr;
begin
   v%init( 'ИВАНОВ', 'ПЕТРОВ', 'СИДОРОВ');
v.extend; v(v.count) := 'И СЕРЕЖА ТОЖЕ';
/*
или так:
select x(&GetValue(vTmp, '#', rownum)   :c_fio
      ) in ::[AC_FIN] all
      where   rownum <= 1+length(vTmp)-length(replace(vTmp, '#', ''))
into v;
*/


   for(
      select x(   x.column_value   :c_fio
      ) in v
   ) loop
      debug_pipe('x.c_fio = {'||x.c_fio||'}', 0);
   end loop;
end;


Если просто проверить, то проще всего
Код:

if instr('#' || vStr || '#', '#' || 'ИВАНОВ' || '#') >0 then
и
Код:

if 'ИВАНОВ' member of v then
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПн Апр 09, 2018 02:47    Ответить с цитатой
Полезность: Нет оценки
Всё это если множество не более 4000 символов.
Иначе видимо бить на куски или в таблицу.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru