码迷,mamicode.com
首页 > 数据库 > 详细

WM_CONCAT字符超过4000的处理办法

时间:2016-11-28 18:25:04      阅读:543      评论:0      收藏:0      [点我收藏+]

标签:ORACLE WM_CONCAT函数字符串超长处理办法

在进行使用WM_CONCAT或者自定义的聚合函数,进行拼串的时候,可能遇到拼串形成的结果集大于4000,这时候,系统会提示,超过系统限制。所以,在这个时候,最好的处理办法就是将结果集处理成CLOB格式,

下面共有两种处理方式:

1、使用函数

类型:


create or replace type str2tblType as table of varchar2(4000)
函数:



复制代码
 CREATE OR REPLACE FUNCTION tab2clob(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;

测试:

初始化数据:

 BEGIN
 FOR idx IN 1 .. 10000 LOOP 
 INSERT INTO ts1 (tm) VALUES (sys_guid()); 
 END LOOP; 
 END;
测试的SQL语句:



 SELECT tab2clob(CAST(COLLECT(tm) AS str2tbltype)) attributes 
 FROM ts1 
 WHERE rownum < 1000

注意:

如下的SQL语句错误:由于类型不同

 SELECT sys_util.tab2clob(CAST(COLLECT(deptno) AS str2tbltype)) 
 FROM (SELECT DISTINCT deptno FROM emp)

会抛出如下的异常信息:

因为在str2tbltype中声明的是varchar2,但是现在deptno是数字,所以数据类型会发生不一致,所以,可以使用to_char见其进行转换,来避免上述的错误:

 SELECT sys_util.tab2clob(CAST(COLLECT(to_char(deptno)) AS str2tbltype)) 
 FROM (SELECT DISTINCT deptno FROM emp)

 二:使用Oracle的SQL提供的处理XML的语句:XMLAGG()

SQL语句如下:

 SELECT rtrim(xmlagg(xmlparse(content ename || , wellformed) ORDER BY ename) 
  .getclobval(), 
 ,) attributes, 
  deptno 
 FROM emp 
 GROUP BY deptno;



转载自:http://blog.csdn.net/l2tp1012/article/details/30744371

WM_CONCAT字符超过4000的处理办法

标签:ORACLE WM_CONCAT函数字符串超长处理办法

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
gem.katu
加入时间:2016-11-21
  关注此人  发短消息
文章分类
gem.katu”关注的人------(0
gem.katu”的粉丝们------(0
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!