我试图分裂一个巨大的CLOB,其中包含超过32K字符的行。
我试着用这个
SELECT REGEXP_SUBSTR(file_cont, '[^'||chr(10)||']+', 1, LEVEL) AS substr
from data_tab where interface = 'Historical'
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(file_cont, '[^'||chr(10)||']+')) + 1表data_tab包含一些以管道作为分隔符的文件。列file_cont是一个clob,包含我们感兴趣的文件。但是,当我尝试执行上面的查询时,似乎有一个无限循环。
有关信息,CLOB包含600多行。
我想要做的是把堵塞一行行地分割成不同的clob。您知道有一个查询可以在不陷入无限循环的情况下显示此结果吗?
编辑:文件大小为22 is。
提前谢谢你。
发布于 2021-05-06 09:49:33
我有一个用于拆分和PCRE正则表达式的特殊包:REGEXP
您可以在regexp.pck中找到这个函数
/**
* Clob simple split
*/
function clob_split_simple(p_clob in clob,p_delim in varchar2)
return clob_table pipelined is
row clob;
l_b number:=1;
l_e number:=1;
$IF DBMS_DB_VERSION.ver_le_11 $THEN
$ELSE
pragma UDF;
$END
begin
while l_e>0
loop
l_e:=instr(p_clob,p_delim,l_b);
pipe row(substr(p_clob,l_b,case when l_e>0 then l_e-l_b else length(p_clob)+length(p_delim)-l_b end));
l_b:=l_e+length(p_delim);
end loop;
end clob_split_simple;因此,您可以使用这个流水线函数:
select *
from table(xt_regexp.clob_split_simple(:clob,chr(10));或者以这段代码为例。
clob_table只是一个table of clob
REGEXP/blob/master/blob es.sql
create or replace type clob_table as table of clob;
/
create or replace type date_table as table of date;
/
create or replace type number_table as table of number;
/
create or replace type varchar2_table as table of varchar2(4000);
/
create or replace type xml_table as table of xmltype;
/Update:修正了一个带有长匹配的错误:返回varchar2的dbms_lob.substr,替换为返回clob的substr(clob)。
https://stackoverflow.com/questions/67414603
复制相似问题