参考网址:

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)

函数:

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;

  

测试:

初始化数据:

1 BEGIN2   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)

会抛出如下的异常信息:

因为在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://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;

关于Oracle中XML的知识,请参考:http://www.oratechinfo.co.uk/sqlxml.html

WMSYS.WM_CONCAT使用方法如下:
SELECT CUST_NO,
SUM(AC.MONEY) AS MONEY,
SUM(AC.INVOPRINT) AS INVOPRINT,
MIN(AC.STARTTIME) AS STARTTIME,
MAX(AC.ENDTIME) AS ENDTIME,
WMSYS.WM_CONCAT(AC.ACCOUNTNO) ACCOUNTNO
FROM T_ACCOUNT AC,
T_FEETYPE FEE,
--T_SUBMITDETAILTOACCOUNT S,
(SELECT ACCOUNTNO, ACCTYPEID
FROM T_ACCUSTACCBOOKDETAIL
GROUP BY ACCOUNTNO, ACCTYPEID) D
WHERE AC.FEECODE = FEE.FEECODE
--AND AC.ACCOUNTNO = S.ACCOUNTNO
AND AC.ACCOUNTNO = D.ACCOUNTNO
AND D.ACCTYPEID = '0001'
AND AC.ACCSTATUS = '4'
AND AC.INVOPRINT = 0
AND FEE.FEETYPE_TYPE = :feeType
--AND S.FLAG = '1'
AND AC.PAYDATE >= TO_DATE(:startdate, 'YYYY-MM-DD')
AND AC.PAYDATE < TO_DATE(:enddate, 'YYYY-MM-DD') + 1
GROUP BY CUST_NO

WM_CONCAT字符超过4000的处理办法的更多相关文章

  1. clob字段超过4000转String类型

    上次提到listagg()和wm_concat()方法合并过的字段类型为clob,要是字段长度超过4000,直接使用to_char()方法转会报错. 解决方法可以在java代码中使用流的方式转化成字符 ...

  2. 让Dapper+SqlCE支持ntext数据类型和超过4000字符的存储

    使用Dapper和SqlCE进行开发的时候,如果数据库的某字段是采用的ntext数据类型,并且在这个字段存储的数据超过了4000个字符,会报如下的错误: Invalid parameter Size ...

  3. SQL Server使用导入导出向导导入超过4000个字符的字段的数据

    在使用SQL Server导入导出向导导入数据的时候,我们经常会碰到某个单元格的数据超长而被截断报错的情况.本文针对这种场景给出相应的解决方案.   环境描述:SQL Server 2012,文件源: ...

  4. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

    情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱 ...

  5. 【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)

      在甲骨文LOB和PHP工作 由哈里Fuecks 达到4,000字节的限制?输入LOB ... 在这个"Oracle + PHP Cookbook"HowTo中,您将学习可用的L ...

  6. Error处理: “非法字符: \65279”的解决办法

    将eclipse项目转为maven项目的时候,编译时遇到 “非法字符: \65279”的报错. 出错内容是: *.java:1: 非法字符: \65279    [javac] package com ...

  7. Glassfish在SpringMVC服务端接收请求时字符出现乱码的解决办法

    环境描述 前端:jsp 后端:SpringMVC Controller 尽管jsp页面已设置了pageEncoding: <%@page contentType="text/html& ...

  8. 用css布局的方法实现如果字符超过一定长度就显示成省略号

    以前实现这种效果需要在程序里判断字符的长度,如果长度大于多少个字符,就截取字符,用省略号代替,而且是在服务器处理的,现在只需要用css的属性来操作,简单.实用.节省性能.不用做过多的程序判断.节约开发 ...

  9. ant 构建时遇到 “非法字符: \65279”的解决办法

    今天使用CI做版本构建时候碰到了这样一个问题,有个activity对应的java源码始终编译报错,错误发生在文件第一行. 出错内容是: *.java:1: 非法字符: \65279    [javac ...

随机推荐

  1. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  2. C++编程学习50个经典网站 强力推荐(转载)

    转自:http://blog.csdn.net/microzone/article/details/6684436 C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c ...

  3. 数据库的硬迁移和mysql 5.5.38源码安装

    场景:一台服务器出现了故障,需要把数据库迁移到另一台服务器上,由于数据效大,直接压缩数库的数据目录(在数据库DOWN的情况下)数据库版本mysql 5.5.38安装方式:源码安装思路:在另一台服务器上 ...

  4. Spring Bean 的加载顺序

    一,单一Bean 装载 1. 实例化; 2. 设置属性值; 3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name; 4. 如果实现BeanFacto ...

  5. Shell(6): 多线程操作及线程数

    任务需要:当我需要对一个文件夹中的文件,分别压缩的时候: 原始的代码: #!/usr/bin/shell function getdir(){ for element in `ls $1` do #e ...

  6. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...

  7. 网易云信消息抄送服务的第三方接口示例(Java)

    package com.netease.nim.route; import com.alibaba.fastjson.JSONObject; import com.netease.nim.route. ...

  8. hive的UDF读取配置文件

    hive的UDF读取配置文件 实现步骤 在读取配置文件的写为./file_name,然后在添加UDF的时候把配置文件也加入资源就好了: add jar xxx.jar; add file file_n ...

  9. shell快捷方式总结

    Linux使用Shell时总是有各种不太方便,需要对输入的命令行做编辑.跳转.这里整理下我遇到的Shell下快捷键. 注意下文中所有的ctrl表示键盘中的控制按键,所有的ctrl + x的格式都是同时 ...

  10. visual studio 2005提示脚本错误 /VC/VCWizards/2052/Common.js

    今天在做OCX添加接口的时候,莫名其妙的遇到visual studio 2005提示脚本错误,/VC/VCWizards/2052/Common.js. 网上找了很多资料,多数介绍修改注册表“vs20 ...