Вы на правильном пути, просто нужно отправить итерированные целые числа в 4-й аргумент regexp_substr
function
Это дает вертикальный результат:
with t(str) as
(
select 'aaa:data1!x,bbb:data2!y,cc:data3!z' from dual
)
select regexp_substr(str,
':([^!]+)',
1,
level,
null,
1) as output
from t
connect by level <= regexp_count(str,'!');
OUTPUT
------
data1
data2
data3
Это дает горизонтальныйрезультат:
with t(str) as
(
select 'aaa:data1!x,bbb:data2!y,cc:data3!z' from dual
), t2 as
(
select regexp_substr(str,
':([^!]+)',
1,
level,
null,
1) as output
from t
connect by level <= regexp_count(str,'!')
)
select listagg(output,' ') within group (order by output) as output from t2
OUTPUT
-----------------
data1 data2 data3