oracle listagg函数字符串链接的结果过长

用listagg函数用,拼接时遇到字符串链接的结果过长,改用

rtrim(xmlagg(XMLELEMENT(e,t.id,',').EXTRACT('//text()')).getclobval(),',') as ids

解决问题

其中t.id是要拼接的列,rtrim用来去掉首尾特殊字符

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle中,如果使用listagg函数拼接的记录太多,会导致返回的字符串长度过长,从而报错。这是因为listagg函数返回的类型为varchar,最大长度为4000。当长度超过4000时,会报错ora-01489 result of String concatenation is too long。为了解决这个问题,可以使用以下两种方法: 1.使用XMLAGG函数代替listagg函数,将结果转换为XML格式,然后再将XML转换为字符串。这种方法可以避免字符串长度过长的问题,但是需要进行额外的转换操作,可能会影响性能。 ```sql SELECT RTRIM(XMLAGG(XMLELEMENT(E, column_name, ',')).EXTRACT('//text()'),',') AS column_names FROM table_name; ``` 2.使用自定义聚合函数来代替listagg函数,这种方法可以自定义返回类型和最大长度,从而避免字符串长度过长的问题。 ```sql CREATE OR REPLACE TYPE string_agg_type AS OBJECT ( total VARCHAR2(32767), STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER ); / CREATE OR REPLACE TYPE BODY string_agg_type IS STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER IS BEGIN sctx := string_agg_type(NULL); RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER IS BEGIN IF (self.total IS NULL) THEN self.total := value; ELSE self.total := self.total || ',' || value; END IF; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER IS BEGIN returnValue := self.total; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER IS BEGIN IF (ctx2.total IS NOT NULL) THEN IF (self.total IS NULL) THEN self.total := ctx2.total; ELSE self.total := self.total || ',' || ctx2.total; END IF; END IF; RETURN ODCIConst.Success; END; END; / CREATE OR REPLACE FUNCTION string_agg(input VARCHAR2, max_length NUMBER) RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING string_agg_type; ``` 使用自定义聚合函数的示例: ```sql SELECT string_agg(column_name, 4000) AS column_names FROM table_name; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值