Home » SQL & PL/SQL » SQL & PL/SQL » Read BLOB from Column and Parse the Data (Oracle, 19.2, Linux)
Read BLOB from Column and Parse the Data [message #690465] Thu, 26 March 2026 15:47
Duane
Messages: 586
Registered: December 2002
Senior Member
I'm not sure this can be done or not and that's why I'm asking.

Problem:
BLOB column contains CSV data.  Basically, a file of CSV data has been inserted into the BLOB column.  I want to read that BLOB column and parse the data row by row.

Solution:
Read the BLOB data line by line and parse the data so that the delimited CSV data has X columns.


Data within BLOB Column

34,1,"FAX",2010-03-11T23:54:33,"314"
35,1,"BU",2011-01-11T23:54:33,"314"
36,1,"BU",2012-02-11T23:54:33,"314"



This works if the CSV data is within a CLOB column and is one row of data.  If the CSV data has 10 rows then the table has 10 rows of data.  One row for each line.

Data within CLOB Column  (Three rows of data with each row containing one line of data)

34,1,"FAX",2010-03-11T23:54:33,"314"
35,1,"BU",2011-01-11T23:54:33,"314"
36,1,"BU",2012-02-11T23:54:33,"314"


create table csv_data
  (csv_data clob)


insert into csv_data
  (csv_data)
  
  values
    ('34,1,"FAX",2010-03-11T23:54:33,"314"');

insert into csv_data
  (csv_data)
  
  values
    ('35,1,"BU",2011-01-11T23:54:33,"314"');

insert into csv_data
  (csv_data)
  
  values
    ('36,1,"BU",2012-02-11T23:54:33,"314"');
commit;


create or replace package SplitData as 
  
  function SplitString (TableName  dbms_tf.table_t,
                        ColumnName dbms_tf.columns_t,
                        Delimiter  varchar2 default ',') return clob sql_macro;

  function SplitString (DelimitedData varchar2,
                        Delimter      varchar2 default ',') return clob sql_macro;

 end;
create or replace package body SplitData as 
  
  function SplitString (TableName  dbms_tf.table_t,
                        ColumnName dbms_tf.columns_t,
                        Delimiter  varchar2 default ',') return clob sql_macro as
    
    SQLStatement clob;


    begin

      SQLStatement := 'select t.*, 
                              regexp_substr('||ColumnName(1)||', ''[^''||Delimiter||'']+'', 1, position) string_value,
                              position
                         from (select rownum row_num,
                                      TableName.*
                                 from TableName) t,
                              lateral (select level position
                                         from dual
                                         connect by level <= length ('||ColumnName(1)||') - length (replace('||ColumnName(1)|| ', Delimiter)) + 1)';

      return SQLStatement;

    end SplitString;


  function SplitString (DelimitedData varchar2,
                        Delimter      varchar2 default ',') return clob sql_macro as

    SQLStatement clob;


    begin
      SQLStatement := 'select regexp_substr(DelimitedData, ''[^''||Delimter||'']+'', 1, level) string_value,
                              level position
                         from dual
                         connect by level <= length (DelimitedData) - length(replace(DelimitedData, Delimter)) + 1';

      return SQLStatement;

    end SplitString;

end SplitData;
select column1,
       column2,
       column3,
       column4,
       column5
  from (select row_num,
               replace(to_char(string_value), '"') string_value,
               to_number(position) position
          from SplitData.SplitString(csv_data, columns(csv_data)))
    pivot (min(string_value) for position in (1   as column1,
                                              2   as column2,
                                              3   as column3,
                                              4   as column4,
                                              5   as column5));
Previous Topic: complex cross tab report
Next Topic: Assertion error ora-8697
Goto Forum:
  


Current Time: Mon Apr 06 23:34:12 CDT 2026