Генерация csv в clob, парсинг

1.Создание таблицы

create table TEST_JDBC_BLOB
(
  img_id VARCHAR2(32),
  image  CLOB
)

2. Пополнение случайными данными
declare
src  clob;
dest clob;
begin
   SELECT image INTO dest
        FROM TEST_JDBC_BLOB
        WHERE img_id = 'mockdata.csv' FOR UPDATE;

  for i in 1..5000 loop
   
select to_clob(
to_char(i)||';'||
(case when round(dbms_random.value(1,7))!=7 then dbms_random.string('x',round(dbms_random.value(1,10))) end)||';'||
(case when round(dbms_random.value(1,7))!=7 then dbms_random.string('x',round(dbms_random.value(1,10))) end)||';'||
(case when round(dbms_random.value(1,7))!=7 then dbms_random.string('x',round(dbms_random.value(1,10))) end)||';'||
(case when round(dbms_random.value(1,7))!=7 then dbms_random.string('x',round(dbms_random.value(1,10))) end)||';'||
(case when round(dbms_random.value(1,7))!=7 then dbms_random.string('x',round(dbms_random.value(1,10))) end)||';'||
(case when round(dbms_random.value(1,7))!=7 then round(dbms_random.value(1,1000)) end)||chr(10)
)
into src
from dual;
 DBMS_LOB.APPEND(dest, src);
  end loop;
  COMMIT;
end;

3. чтение csv
 select x.*
    from test_jdbc_blob t
       , xmltable('/a/b'
           passing xmlparse(document
                     '<a><b><c>' ||
                     replace(
                       replace(
                         dbms_xmlgen.convert(t.image)
                       , ';'
                     , '</c><c>'
                     )
                   , chr(10)
                   , '</c></b><b><c>'
                   ) ||
                   '</c></b></a>'
                   wellformed
                 )
         columns col1 varchar2(4000) path 'c[1]'
               , col2 varchar2(4000) path 'c[2]'
               , col3 varchar2(4000) path 'c[3]'
               , col4 varchar2(4000) path 'c[4]'
               , col5 varchar2(4000) path 'c[5]'
               , col6 varchar2(4000) path 'c[6]'
               , col7 varchar2(4000) path 'c[7]'
       ) x
  where t.img_id = 'mockdata.csv'

4. Генерируем 200Мб CSV. Контроль размера.

select round(s.bytes/1024/1024) as SizeCsVMb
from
user_segments s
where s.segment_name=(select l.segment_name
                        from user_lobs l
                       where l.table_name='TEST_JDBC_BLOB')

5. Количество записей и время полного чтения через ctas.

  
create table delit_test_numrows_time as
 select x.*
    from test_jdbc_blob t
       , xmltable('/a/b'
           passing xmlparse(document
                     '<a><b><c>' ||
                     replace(
                       replace(
                         dbms_xmlgen.convert(t.image)
                       , ';'
                     , '</c><c>'
                     )
                   , chr(10)
                   , '</c></b><b><c>'
                   ) ||
                   '</c></b></a>'
                   wellformed
                 )
         columns col1 varchar2(4000) path 'c[1]'
               , col2 varchar2(4000) path 'c[2]'
               , col3 varchar2(4000) path 'c[3]'
               , col4 varchar2(4000) path 'c[4]'
               , col5 varchar2(4000) path 'c[5]'
               , col6 varchar2(4000) path 'c[6]'
               , col7 varchar2(4000) path 'c[7]'
       ) x

  where t.img_id = 'mockdata.csv'