WM_CONCAT字符超过4000的处理办法
参考网址:
字符串拼接技巧和方式: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的处理办法的更多相关文章
- clob字段超过4000转String类型
上次提到listagg()和wm_concat()方法合并过的字段类型为clob,要是字段长度超过4000,直接使用to_char()方法转会报错. 解决方法可以在java代码中使用流的方式转化成字符 ...
- 让Dapper+SqlCE支持ntext数据类型和超过4000字符的存储
使用Dapper和SqlCE进行开发的时候,如果数据库的某字段是采用的ntext数据类型,并且在这个字段存储的数据超过了4000个字符,会报如下的错误: Invalid parameter Size ...
- SQL Server使用导入导出向导导入超过4000个字符的字段的数据
在使用SQL Server导入导出向导导入数据的时候,我们经常会碰到某个单元格的数据超长而被截断报错的情况.本文针对这种场景给出相应的解决方案. 环境描述:SQL Server 2012,文件源: ...
- SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;
情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱 ...
- 【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)
在甲骨文LOB和PHP工作 由哈里Fuecks 达到4,000字节的限制?输入LOB ... 在这个"Oracle + PHP Cookbook"HowTo中,您将学习可用的L ...
- Error处理: “非法字符: \65279”的解决办法
将eclipse项目转为maven项目的时候,编译时遇到 “非法字符: \65279”的报错. 出错内容是: *.java:1: 非法字符: \65279 [javac] package com ...
- Glassfish在SpringMVC服务端接收请求时字符出现乱码的解决办法
环境描述 前端:jsp 后端:SpringMVC Controller 尽管jsp页面已设置了pageEncoding: <%@page contentType="text/html& ...
- 用css布局的方法实现如果字符超过一定长度就显示成省略号
以前实现这种效果需要在程序里判断字符的长度,如果长度大于多少个字符,就截取字符,用省略号代替,而且是在服务器处理的,现在只需要用css的属性来操作,简单.实用.节省性能.不用做过多的程序判断.节约开发 ...
- ant 构建时遇到 “非法字符: \65279”的解决办法
今天使用CI做版本构建时候碰到了这样一个问题,有个activity对应的java源码始终编译报错,错误发生在文件第一行. 出错内容是: *.java:1: 非法字符: \65279 [javac ...
随机推荐
- 【Unity】4.5 树木创建器
分类:Unity.C#.VS2015 创建日期:2016-04-11 一.简介 在地形编辑器一节中,已经告诉了你如何使用已经创建好的树来形成大片树林.这一节告诉你在 Unity 5.3.4中如何利用[ ...
- 从tableview中拖动某个精灵
virtual void registerWithTouchDispatcher(void); virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *p ...
- Lua官方文档与源码分析
https://www.lua.org/source/5.3/ http://www.cppblog.com/airtrack/archive/2012/09/19/191233.html https ...
- Linux下找不到so文件的解决办法
http://www.cnblogs.com/xudong-bupt/p/3698294.html 如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时 ...
- Linux 移动或重命名文件/目录-mv 的10个实用例子
本文导航 -初识 mv 命令03% -1.移动文件08% -2.移动多个文件15% -3.移动目录23% -4.重命名文件或目录27% -5. 重命名目录35% -6. 打印移动信息39% -7. 使 ...
- python--笨方法学python 习题52
笨方法学python是一本不错的python入门书籍.书的最后一节是一个web版的游戏程序,以下是程序代码: 1.项目的目录结构如下所示:skeleton\ app.py map.py templat ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
- 【delphi】TStringList类常用属性方法详解
TStringList 常用方法与属性 var List: TStringList; i: Integer; begin List := TStringList.Create; List.Add('S ...
- 将本地代码同步到远程github上
1.在本地文件夹下建立.gitignore文件,将github下的github/gitignore/Node.gitignore文件复制到.gitignore中: 2.执行命令git add . 3. ...
- 基于jQuery悬停图片变色放大特效
分享一款基于jQuery悬停图片变色放大特效是一款响应式鼠标悬停图片放大效果代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div style="width ...