oracle 根据CHR(10)换行符逐行提取拆分CLOB为多行数据

2023年 7月 12日 36.6k 0

oracle 根据CHR(10)换行符逐行提取拆分CLOB为多行数据

项目中遇到了难题,使用润乾报表打印长篇幅文章,单页数据超长,无法正常打印。于是我们想出了,将oracle CLOB类型拆分为一行一行的段落,返给报表,做成动态数据,实现多页可以打印出来。我已经验证过了,拆分输出几十个段落的文章只需要很短的时间。

以下方法使用的一种有趣的优化技术,将CLOB拆分成32K的varchar2块。 可以使用DBMS_LOB包或通过重载的SQL函数直接拆分CLOB;但是CLOBS成本太高。另一方面,Varchar2变量体积小,使得它们内部的子解析速度要快得多。但是,这样做的话需要更加谨慎,以确保这些小块不会意外地将一行分割成两行身子N多行。

另外,我也假设没有一行超过32K,对于这种情况这个函数更具优势,因为输出是一个SQL集合,其varchar2限制为4000字节。 返回的VCARRAY类型是一个简单的表集合类型。

首先需要创建一个表集合类型

CREATE OR REPLACE TYPE VCARRAY as table of varchar2(4000)

下面创建一个函数:

CREATE OR REPLACE FUNCTION split_clob(p_clob IN CLOB, p_delimiter IN VARCHAR2 DEFAULT CHR(10))
RETURN vcarray
PIPELINED
IS
-- .///.
-- (0 o)
---------------0000--(_)--0000---------------
--
-- Sean D. Stuber
-- sean.stuber@gmail.com
--
-- oooO Oooo
--------------( )-----( )---------------
-- ( ) /
-- _) (_/

c_chunk_limit CONSTANT INTEGER := 32767;
v_clob_length INTEGER := DBMS_LOB.getlength(p_clob);
v_clob_index INTEGER;
v_chunk VARCHAR2(32767);
v_chunk_end INTEGER;
v_chunk_length INTEGER;
v_chunk_index INTEGER;
v_delim_len INTEGER := LENGTH(p_delimiter);
v_line_end INTEGER;
BEGIN
v_clob_length := DBMS_LOB.getlength(p_clob);
v_clob_index := 1;

WHILE v_clob_index

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论