参考网址:

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. 菜鸟学SSH(七)——Spring jar包详解

    Struts.Hibernate.Spring这类的框架给我们开发带来非常大的好处,让我们更加快速.有效的开发.所以我们在开发中通常都会用到各种框架,每个框架都有很多jar包,每个jar都有各自不同的 ...

  2. FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化

     EGL 用它开发需要做哪些事情. DIsplay 与原生窗口建立链接.EGL在Android中可以用java调,也可以用C++调. EGLDisplay eglGetDisplay          ...

  3. C++中的typedef typename 作用

    今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...

  4. select元素添加option的add()方法 | try{}catch{}

    1.javascript中的select元素添加option使用add()方法 select的add方法,第一个参数是需要被添加的option元素,第二个参数决定了被添加的位置 普通浏览器中,第二个参 ...

  5. [Windows Azure] How to Configure Cloud Services

    How to Configure Cloud Services To use this feature and other new Windows Azure capabilities, sign u ...

  6. vue.js中请求数据v-for循环使用数据

    1.效果图 2.cart.json { "message":"", "status":"1", "result ...

  7. iOS开发-按钮的基本使用

    // //  ViewController.m //  05-用代码创建按钮 // //  Created by vic fan on 2017/7/30. //  Copyright © 2017年 ...

  8. 【转】(三)unity4.6Ugui中文教程文档-------概要-UGUI Basic Layout

    原创至上,移步请戳:(三)unity4.6Ugui中文教程文档-------概要-UGUI Basic Layout 2. BasicLayout 在这一节我们会看到UI元素相对于画布的位置是怎样的. ...

  9. 【ARM】串行通信

    异步通信 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本是同步的.   异步串行通信的特点可以概括如下 1)以字符为单位传送信息 2)相邻两字符间的间隔是 ...

  10. BOE系统与BW系统间的单点登录(注:这里先简单写一下,改天有时间再进行详细的描述)

    1,在BOE系统内进行配置,将BW系统内的用户信息导入BOE 2,在BOE系统内定义这些导入用户对BOE对象有哪些权限 3,用户使用BW系统的用户名密码登录BOE系统:BOE将登录凭证转发给BW系统让 ...