разберем сегодня интересный пример - мы передаем в процедуру PL SQL набор диапазонов условных значений
необходимо сделать процедуру которая выводила бы значения числовой последовательностей например,
от - 1 до 5, 15-20, 33-38 , то есть произвольный перечень числовых диапазонов
напишем процедуру, где с помощью регулярных выражений разберем параметр и выведем диапазоны как запрос
для работы с текстовым передаваемым выражением используем конструкцию CONNECT BY
Передача диапазонов значений в процедуру , в качестве входного параметра
Категория: Блог
Опубликовано 23.05.2017
create or replace procedure prc_test(p_period varchar2) is [more] begin for t in ( select regexp_substr(ll,'[^-]+',1,1) l1 , regexp_substr(ll,'[^-]+',1,2) l2 , ll.* -- регулярное выражение для значений внутри диапазона from ( select regexp_substr(p_period,'[^,]+',1,level) ll -- реуглярное выражение для работы с диапазоном from dual connect by level <= REGEXP_COUNT(p_period,',')+1 ) ll ) loop for i in t.l1..t.l2 loop dbms_output.put_line(i); -- вывод значений end loop; dbms_output.put_line(''); -- пустая строка для отделения диапазона end loop; end prc_test;
вызовем созданную процедуру, проверим работоспособность
begin -- Test statements here prc_test('1-5,15-20,33-38'); end;
результат
1
2
3
4
5
15
16
17
18
19
20
33
34
35
36
37
38
xtender предложил в комментариях более интересное решение
публикую его в блоге
select * from xmltable('1 to 5, 10 to 15' columns "." int);
результат
1
2
3
4
5
10
11
12
13
14
15
На самом деле это гораздо проще лучше с помощью xmltable, единственное отличие, что вместо минуса нужно использовать "to":
Или пример с заменой минуса на "to":