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));
|
|
|
|
Goto Forum:
Current Time: Mon Apr 06 23:34:12 CDT 2026
|