Joomla 3.1 Templates by FatCow Coupon

Передача диапазонов значений в процедуру , в качестве входного параметра

Категория: Блог Опубликовано 23.05.2017
разберем сегодня интересный пример - мы передаем в процедуру PL SQL набор диапазонов условных значений
необходимо сделать процедуру которая выводила бы значения числовой последовательностей например,
от - 1 до 5, 15-20, 33-38 , то есть произвольный перечень числовых диапазонов
напишем процедуру, где с помощью регулярных выражений разберем параметр и выведем диапазоны как запрос
для работы с текстовым передаваемым выражением используем конструкцию CONNECT BY

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":

    SELECT * FROM xmltable('1 to 10, 50 to 60' COLUMNS "." INT);

     



    Или пример с заменой минуса на "to":

    select *
    from 
    table(
    sys.ku$_vcnt( '1-5'
    ,'1-10,11'
    ,'1-5,15-20,33-38'
    )
    ) t1
    ,xmltable(
    (replace(t1.column_value,'-',' to ')) 
    columns "." int
    ) t2;
     

     

Просмотров: 430