oracle的concat字符串太长,自定义聚集函数,仿wm_concat,使用CLOB,可处理超过4000长度字符串...

因开发需要,在使用wm_concat函数时,在字符串长度超过4000后报错,所以自定义一个类似的聚集函数,在内部使用CLOB处理,避免超长问题。

源码如下:

先以sys用户授权:

grant execute on dbms_lob to xxx;

CREATE OR REPLACE

TYPE typ_concat_clob AS OBJECT

(

concat_str CLOB,

splitstr CLOB,

--ODCIAggregateInitialize做一些初始化操作

STATIC FUNCTION

ODCIAggregateInitialize(cs_ctx In Out typ_concat_clob) return number,

--ODCIAggregateIterate是主要的处理逻辑所在,这里定义一个迭代操作

member function ODCIAggregateIterate(self In

Out typ_concat_clob,srcvalue in VARCHAR2) return number,

-- ODCIAggregateMerge是一个合并函数,如果在使用时指定了partition enabled,就必须定义此函数,用来把并行处理的结果进行合并

member function ODCIAggregateMerge(self In

Out typ_concat_clob,ctx2 In Out typ_concat_clob) return number,

--ODCIAggregateTerminate是一个终止函数,顾名思义,在这个函数中对结果做最后处理并返回

member function ODCIAggregateTerminate(self

In Out typ_concat_clob,returnValue Out CLOB,flags IN NUMBER) return number

)

CREATE OR REPLACE

TYPE BODY typ_concat_clob IS

STATIC FUNCTION

ODCIAggregateInitialize(cs_ctx In Out typ_concat_clob) return NUMBER

IS

BEGIN

cs_ctx :=

typ_concat_clob(to_clob(','),to_clob(','));

RETURN ODCICONST.SUCCESS;

END;

member function ODCIAggregateIterate(self In

Out typ_concat_clob,srcvalue IN VARCHAR2) return NUMBER

IS

BEGIN

dbms_lob.append(self.concat_str,to_clob(srcvalue));

dbms_lob.append(self.concat_str,self.splitstr);

RETURN ODCICONST.SUCCESS;

END;

member function ODCIAggregateMerge(self In

Out typ_concat_clob,ctx2 In Out typ_concat_clob) return NUMBER

IS

BEGIN

IF ctx2 IS NOT NULL THEN

dbms_lob.append(self.concat_str,ctx2.concat_str);

END IF;

RETURN ODCICONST.SUCCESS;

END;

member function ODCIAggregateTerminate(self

In Out typ_concat_clob,returnValue Out CLOB,flags IN NUMBER) return NUMBER

IS

BEGIN

dbms_lob.trim(self.concat_str,dbms_lob.getlength(self.concat_str)-1);

self.concat_str :=

dbms_lob.substr(self.concat_str,dbms_lob.getlength(self.concat_str)-1,2);

returnValue := self.concat_str;

RETURN ODCICONST.SUCCESS;

END;

END;

/

CREATE OR REPLACE

FUNCTION fun_concat_clob(in_str VARCHAR2) RETURN CLOB

AGGREGATE USING typ_concat_clob;

/

使用和wm_concat一样,不同的是内部处理和返回值都是CLOB类型的:

SELECT

fun_concat_clob(name)FROM students

GROUP BY class;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值