Как разбить 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