Что ж, это возвращает желаемый результат, но я не знаю, будет ли он работать всегда , поскольку вы не объясняли правила, ведущие от источника к цели.
SQL> with test (col) as
2 (select 'Tprintthisstring' from dual
3 ),
4 temp as
5 -- c1 is the first letter
6 -- then split the rest into groups of 3 letters (rows)
7 (select substr(substr(col, 2), 3 * (level - 1) + 1, 3) c2,
8 level lvl,
9 substr(col, 1, 1) c1
10 from test
11 connect by level <= length(substr(col, 2))
12 )
13 -- aggregate the c2 string back, separated by comma
14 select c1 ||','||
15 listagg(c2, ',') within group (order by lvl) result
16 from temp
17 where c2 is not null
18 group by c1;
RESULT
-------------------------------------------------------------------------------
T,pri,ntt,his,str,ing
SQL>
Я не уверен, почему вы пометили его как PL / SQL и какой это должен быть PL / SQL;анонимный блок? Хранимая процедура? Как бы то ни было, приведенный выше запрос можно легко преобразовать в PL / SQL.