首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过PLSQL逐行拆分CLOB (有些行的字符超过32K )?

如何通过PLSQL逐行拆分CLOB (有些行的字符超过32K )?
EN

Stack Overflow用户
提问于 2021-05-06 08:36:37
回答 1查看 1.2K关注 0票数 0

我试图分裂一个巨大的CLOB,其中包含超过32K字符的行。

我试着用这个

代码语言:javascript
复制
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。

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 09:49:33

我有一个用于拆分和PCRE正则表达式的特殊包:REGEXP

您可以在regexp.pck中找到这个函数

代码语言:javascript
复制
/**
 * 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;

因此,您可以使用这个流水线函数:

代码语言:javascript
复制
select * 
from table(xt_regexp.clob_split_simple(:clob,chr(10));

或者以这段代码为例。

clob_table只是一个table of clob

REGEXP/blob/master/blob es.sql

代码语言:javascript
复制
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)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67414603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档