Как разбить CLOB колонку на несколько колонок?

Есть таблица с колонкой data типа CLOB. Значения имеют от 12000 до 15000 символов в этой колонке.

Допустим, если data содержит 12200 символов, то необходимо вывести несколько колонок:

data1        data2        data3        data4
-----------  -----------  -----------  -----------
first 4000   second 4000  third 4000   last 200

Как это можно сделать?


Свободный перевод вопроса Splitting or Substr one column into multiple columns in Oracle от участника @joe


Ответы (1 шт):

Автор решения: 0xdb

Можно воспользоваться фукцией DBMS_LOB.SUBSTR.

Создайте процедуру, которая динамически поделит колонку на заданные кол-во колонок и длину:

create or replace procedure splitClob (
    tab varchar2, col varchar2, len int, pieces int, rc out sys_refcursor) as
    cols varchar2 (32000);
begin
    for i in 1..pieces loop
        cols := cols||'dbms_lob.substr ('||col||','||len||','||(len*(i-1)+1)||') '||col||i||',';
    end loop;
    dbms_output.put_line ('cols='||cols);
    open rc for 'select '||rtrim (cols, ',')||' from '||tab;
end;
/

Результат:

create table clobs (data) as
    select to_clob ('123abc456defzz') from dual union all
    select to_clob ('aaa111bbb222zz') from dual
/
var rc refcursor 
exec splitClob ('clobs','data', 4, 4, :rc) 

DATA1 DATA2 DATA3 DATA4
----- ----- ----- -----
123a  bc45  6def  zz   
aaa1  11bb  b222  zz   
→ Ссылка