ops$tkyte%ORA11GR2> variable txt varchar2(4000)
ops$tkyte%ORA11GR2> exec :txt := '1,3,5,7:27,29,31,32:43'
PL/SQL procedure successfully completed.
ops$tkyte%ORA11GR2> column token format a10
ops$tkyte%ORA11GR2> column p1 format a10
ops$tkyte%ORA11GR2> column p2 format a10
ops$tkyte%ORA11GR2>
ops$tkyte%ORA11GR2> with data
2 as
3 (
4 select
5 trim( substr (txt,
6 instr (txt, ',', 1, level ) + 1,
7 instr (txt, ',', 1, level+1)
8 - instr (txt, ',', 1, level) -1 ) )
9 as token
10 from (select ','||:txt||',' txt
11 from dual)
12 connect by level <=
13 length(:txt)-length(replace(:txt,',',''))+1
14 ),
15 data2 as
16 (select token, substr( token, 1, instr( token||':', ':' )-1 ) p1,
17 nvl( substr( token, instr( token||':', ':')+1 ), token) p2
18 from data)
19 select token, p1+column_value
20 from data2, table( cast( multiset( select level-1 R from dual connect by level <= p2-p1+1) as sys.odciNumberList) )
21 /
TOKEN P1+COLUMN_VALUE
---------- ---------------
1 1
3 3
5 5
7:27 7
7:27 8
7:27 9
7:27 10
7:27 11
7:27 12
7:27 13
7:27 14
7:27 15
7:27 16
7:27 17
7:27 18
7:27 19
7:27 20
7:27 21
7:27 22
7:27 23
7:27 24
7:27 25
7:27 26
7:27 27
29 29
31 31
32:43 32
32:43 33
32:43 34
32:43 35
32:43 36
32:43 37
32:43 38
32:43 39
32:43 40
32:43 41
32:43 42
32:43 43
38 rows selected.
ops$tkyte%ORA11GR2> with data
2 as
3 (
4 select
5 trim( substr (txt,
6 instr (txt, ',', 1, level ) + 1,
7 instr (txt, ',', 1, level+1)
8 - instr (txt, ',', 1, level) -1 ) )
9 as token
10 from (select ','||:txt||',' txt
11 from dual)
12 connect by level <=
13 length(:txt)-length(replace(:txt,',',''))+1
14 ),
15 data2 as
16 (select token, substr( token, 1, instr( token||':', ':' )-1 ) p1,
17 nvl( substr( token, instr( token||':', ':')+1 ), token) p2
18 from data)
19 select listagg( p1+column_value, ',' ) within group ( order by p1+column_value)
20 from data2, table( cast( multiset( select level-1 R from dual connect by level <= p2-p1+1) as sys.odciNumberList) )
21 /
LISTAGG(P1+COLUMN_VALUE,',')WITHINGROUP(ORDERBYP1+COLUMN_VALUE)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1,3,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,29,31,32,33,34,35,36,37,38,39,40,41,42,43