WM_CONCAT字符超过4000的处理办法
2017-10-20 16:17
411 查看
参考网址:
http://stackoverflow.com/questions/11541383/ordering-by-list-of-strings-in-oracle-sql-without-listagg
字符串拼接技巧和方式:http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php
http://www.williamrobertson.net/documents/one-row.html
在进行使用WM_CONCAT或者自定义的聚合函数,进行拼串的时候,可能遇到拼串形成的结果集大于4000,这时候,系统会提示,超过系统限制。所以,在这个时候,最好的处理办法就是将结果集处理成CLOB格式,
下面共有两种处理方式:
1、使用函数
类型:
函数:
![](//common.cnblogs.com/images/copycode.gif)
![](//common.cnblogs.com/images/copycode.gif)
测试:
初始化数据:
测试的SQL语句:
注意:
如下的SQL语句错误:由于类型不同
会抛出如下的异常信息:
![](http://pic002.cnblogs.com/images/2012/139028/2012111407022169.jpg)
因为在str2tbltype中声明的是varchar2,但是现在deptno是数字,所以数据类型会发生不一致,所以,可以使用to_char见其进行转换,来避免上述的错误:
二:使用Oracle的SQL提供的处理XML的语句:XMLAGG()
SQL语句如下:
结果:
![](http://pic002.cnblogs.com/images/2012/139028/2012111507342758.jpg)
具体:
![](http://pic002.cnblogs.com/images/2012/139028/2012111507351680.jpg)
或者使用如下的语句,可以实现同样的功能:
参考网站:http://www.williamrobertson.net/documents/one-row.html
下面的语句,没有调用getClobVal(),聚合的结果集是字符串
![](http://pic002.cnblogs.com/images/2012/139028/2012111507410374.jpg)
关于Oracle中XML的知识,请参考:http://www.oratechinfo.co.uk/sqlxml.html
或者http://www.cnblogs.com/caroline/archive/2012/11/15/2770887.html
http://stackoverflow.com/questions/11541383/ordering-by-list-of-strings-in-oracle-sql-without-listagg
字符串拼接技巧和方式:http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php
http://www.williamrobertson.net/documents/one-row.html
在进行使用WM_CONCAT或者自定义的聚合函数,进行拼串的时候,可能遇到拼串形成的结果集大于4000,这时候,系统会提示,超过系统限制。所以,在这个时候,最好的处理办法就是将结果集处理成CLOB格式,
下面共有两种处理方式:
1、使用函数
类型:
1 create or replace type str2tblType as table of varchar2(4000)
函数:
![](http://common.cnblogs.com/images/copycode.gif)
1 CREATE OR REPLACE FUNCTION tab2clob(p_str2tbltype str2tbltype, 2 p_delim IN VARCHAR2 DEFAULT ',') RETURN CLOB IS 3 l_result CLOB; 4 BEGIN 5 FOR cc IN (SELECT column_value 6 FROM TABLE(p_str2tbltype) 7 ORDER BY column_value) LOOP 8 l_result := l_result || p_delim || cc.column_value; 9 END LOOP; 10 RETURN ltrim(l_result, p_delim); 11 END;
![](http://common.cnblogs.com/images/copycode.gif)
测试:
初始化数据:
1 BEGIN 2 FOR idx IN 1 .. 10000 LOOP 3 INSERT INTO ts1 (tm) VALUES (sys_guid()); 4 END LOOP; 5 END;
测试的SQL语句:
1 SELECT tab2clob(CAST(COLLECT(tm) AS str2tbltype)) attributes 2 FROM ts1 3 WHERE rownum < 1000
注意:
如下的SQL语句错误:由于类型不同
1 SELECT sys_util.tab2clob(CAST(COLLECT(deptno) AS str2tbltype)) 2 FROM (SELECT DISTINCT deptno FROM emp)
会抛出如下的异常信息:
![](http://pic002.cnblogs.com/images/2012/139028/2012111407022169.jpg)
因为在str2tbltype中声明的是varchar2,但是现在deptno是数字,所以数据类型会发生不一致,所以,可以使用to_char见其进行转换,来避免上述的错误:
1 SELECT sys_util.tab2clob(CAST(COLLECT(to_char(deptno)) AS str2tbltype)) 2 FROM (SELECT DISTINCT deptno FROM emp)
二:使用Oracle的SQL提供的处理XML的语句:XMLAGG()
SQL语句如下:
1 SELECT rtrim(xmlagg(xmlparse(content ename || ',' wellformed) ORDER BY ename) 2 .getclobval(), 3 ',') attributes, 4 deptno 5 FROM emp 6 GROUP BY deptno;
结果:
![](http://pic002.cnblogs.com/images/2012/139028/2012111507342758.jpg)
具体:
![](http://pic002.cnblogs.com/images/2012/139028/2012111507351680.jpg)
或者使用如下的语句,可以实现同样的功能:
参考网站:http://www.williamrobertson.net/documents/one-row.html
1 SELECT deptno, 2 trim(xmlagg(xmlelement(content, ename || ',' ) ORDER BY ename) 3 .extract('//text()').getclobval()) 4 AS concatenated 5 FROM emp 6 GROUP BY deptno;
下面的语句,没有调用getClobVal(),聚合的结果集是字符串
1 SELECT deptno, 2 trim(xmlagg(xmlelement(content, ename || ',' ) ORDER BY ename) 3 .extract('//text()')) 4 AS concatenated 5 FROM emp 6 GROUP BY deptno;
![](http://pic002.cnblogs.com/images/2012/139028/2012111507410374.jpg)
关于Oracle中XML的知识,请参考:http://www.oratechinfo.co.uk/sqlxml.html
或者http://www.cnblogs.com/caroline/archive/2012/11/15/2770887.html
相关文章推荐
- WM_CONCAT字符超过4000的处理办法
- WM_CONCAT字符超过4000的处理办法
- WM_CONCAT字符超过4000的处理办法
- WM_CONCAT字符超过4000的处理办法
- oracle的函数wm_concat字符超过4000的处理办法
- 自定义聚集函数,仿wm_concat,使用CLOB,可处理超过4000长度字符串
- WMSYS.WM_CONCAT 突破4000字符的方法
- 关于wmsys.wm_concat列超出4000处理
- 数据库存储字符超过2000处理办法;
- wm_concat(列名)拼接超过4000后异常
- Oracle处理CLOB超过4000入库问题 (2)
- windows mobile WM 6.1MMS subject不超过40个字符添加方法
- 关于url传参特殊字符的处理办法
- 动态sql语句超过8000个字符的处理方法
- NH里解决超过4000字符传参问题
- sid超过8个字符处理步骤
- EXCEL某列长度超过255个字符导入SQL SERVER2005的处理方法
- 针对AndroidStudio打包和运行程序是,方法数超过65536的处理办法
- vi在修改汉字的时候,把汉字作为一个字符处理的设置办法
- ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的解决办法