自定义聚集函数代替wm_concat,WM_CONCAT字符超过4000的处理办法

-- 准备数据
create table test(id number,name varchar2(100));

-- 删除表,测试后不需要时调用
drop table test  

-- 测试数据
insert into test values(1,'a');  
insert into test values(1,'b');  
insert into test values(1,'c');  
insert into test values(2,'d');  
insert into test values(2,'e');  

-- 检查测试数据
select * from test

--测试系统自带wm_concat
select wm_concat(name) from test


-------------------------------------------------------------------------------------开始
-- 步骤1:自定义一个类型【str2tblType 】
create or replace type str2tblType as table of varchar2(4000)


-- 步骤2:自定义函数【my_wm_concat】
CREATE OR REPLACE FUNCTION my_wm_concat(
    p_str2tbltype str2tbltype,
    p_delim       IN VARCHAR2 DEFAULT ','
    ) 
RETURN CLOB IS
l_result CLOB;
BEGIN 
    FOR cc IN (SELECT column_value
              FROM TABLE(p_str2tbltype)
             ORDER BY column_value) LOOP
  l_result := l_result || p_delim || cc.column_value;
 END LOOP;
RETURN ltrim(l_result, p_delim);
END;

-- 步骤3-初始化测试数据
BEGIN   
  FOR idx IN 1 .. 10000 LOOP
  INSERT INTO test(id,name) VALUES (1,sys_guid());
  END LOOP;
END;

-- 步骤4-调用测试1
SELECT my_wm_concat(CAST(COLLECT(name) AS str2tbltype)) attributes
FROM test
WHERE rownum < 1000;

SELECT my_wm_concat(
  CAST(COLLECT(emp_name) AS str2tbltype))
FROM  dim_employee

SELECT my_wm_concat(
  CAST(COLLECT(emp_name) AS str2tbltype),
  'aa'-- 分割字符,若不传,默认','
  )
FROM  dim_employee

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值