oracle 使用listagg函数后 字符串连接的结果过长

oracle 使用listagg函数后 字符串连接的结果过长最终解决

 

SELECT
    r.department_id law_dept_id,
    (
        SELECT
            xmlagg(xmlparse(content rt.extracted_person_ids||',' wellformed) order by rt.extracted_person_ids).getclobval()
        FROM
            RANDOM_TASK rt,
            SYS_DEPARTMENT sd
        WHERE
            rt.CREAT_DEPARTMENT_ID = sd.DEPARTMENT_ID
        AND sd.DEPARTMENT_NUMBER LIKE CONCAT (r.department_num, '%')
        AND rt.distributed_state = 1
        AND rt.STATE = 1
        AND rt.LAUNCH_DATE BETWEEN TO_DATE ('2017-07-05', 'yyyy-mm-dd')
        AND (TO_DATE('2017-07-05', 'yyyy-mm-dd') + 1)
    ) law_user_str
FROM
    random_user_count r
ORDER BY
    r.area_code,
    r.department_num;

 

上述方法已通过验证。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

Cherry柠檬水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值