Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 символов.
Иначе видимо бить на куски или в таблицу. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|