Вот решение, которое должно работать в DB2 с небольшими изменениями (но учтите, что я вообще не знаю DB2; я просто использую функции Oracle, которые есть в стандарте SQL, поэтому они должны быть реализованы одинаково - или почти так - в DB2).
Ниже я создаю таблицу с вашими примерами данных; затем я покажу, как разбить его на подстроки длиной не более 8 символов. Хотя строки короткие, я определил столбец как CLOB и использую инструменты CLOB; это должно работать на гораздо больших CLOB.
При необходимости вы можете преобразовать размер чанка и идентификатор в параметры связывания. В моей демонстрации ниже я жестко закодировал размер чанка и показываю результат для всех идентификаторов в таблице. В случае, если CLOB НЕДЕЙСТВИТЕЛЕН, я возвращаю один кусок (который, конечно, НЕДЕЙСТВИТЕЛЕН).
Обратите внимание, что касание CLOB в запросе очень дорого; поэтому большая часть работы выполняется без прикосновения к CLOB. Я работаю над ними как можно меньше.
ПОДГОТОВКА РАБОТЫ
drop table tbl purge; -- If needed
create table tbl (id number, clob_value clob);
insert into tbl (id, clob_value)
select 1, 'really large clob' from dual union all
select 2, 'medium clob' from dual union all
select 3, 'another large clob' from dual union all
select 4, null from dual -- added to check handling
;
commit;
QUERY
with
prep(id, len) as (
select id, dbms_lob.getlength(clob_value)
from tbl
)
, rec(id, len, ord, pos) as (
select id, len, 1, 1
from prep
union all
select id, len, ord + 1, pos + 8
from rec
where len >= pos + 8
)
select id, ord, dbms_lob.substr(clob_value, 8, pos)
from tbl inner join rec using (id)
order by id, ord
;
ID ORD CHUNK
---- ---- --------
1 1 really l
1 2 arge clo
1 3 b
2 1 medium c
2 2 lob
3 1 another
3 2 large cl
3 3 ob
4 1