WM_CONCAT字符超过4000的处理办法

在进行使用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

时间: 2024-10-05 18:54:04

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

防止变量超过上限的巧妙办法

int n=0; int max = 100; //通常的做法(省略上下文) if(n>=max) {     n = 0; } n++; //巧妙的做法 n%=max n++ 防止变量超过上限的巧妙办法

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

情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱码 @RequestMapping(params = "method=submit") public String submit(HttpServletRequest request, ModelMap modelMap) throws Exception{ String uname =

npoi workbook 的 cellstyle 创建不能超过4000的解决方法

利用NPOI进行Excel的工作表(Sheet)复制时,如果复制的工作表(Sheet)较多(100个左右),会报告 workbook 的 cellstyle 创建不能超过4000 的错误. 代码如下: public static void CopySheet(ISheet fromSheet, ISheet toSheet, bool copyValueFlag) { //合并区域处理 MergerRegion(fromSheet, toSheet); System.Collections.IE

js实现从字符串中查找出现次数最多的字符的两种解决办法

方法一:正则表达式匹配 1 var str = "adadfdfseffserfefsefseeffffftsdg"; 2 var maxLength = 0; var result = ""; 3 while (str != '') { 4 oldStr = str; 5 getStr = str.charAt(0); 6 str = str.replace(new RegExp(getStr, "g"), ""); 7 i

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

使用Dapper和SqlCE进行开发的时候,如果数据库的某字段是采用的ntext数据类型,并且在这个字段存储的数据超过了4000个字符,会报如下的错误: Invalid parameter Size value '-1'. The value must be greater than or equal to 0. 在Google上以“dapper sqlce ntext”作为关键词搜索,可以找到如下两个解决办法: 1. Inserting a string larger then 4000 ch

UITextView textViewDidChange 限制字符长度崩溃问题 解决办法

为了限制uitextview输入的字符数,一般采取如下做法: - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { //判断输入的字符,是否超过界限 NSString *str = [NSString stringWithFormat:@"%@%@", textView.text, text]; if (str.l

移动端图片超过屏幕宽度处理办法

在手机端网页开发时: 有时候我们不希望图片宽度超过屏幕宽度 因为图片太宽会出现滚动条,滚动条是手机端网页的大忌. 解决办法: img{max-width:100%;!important} 这样即使图片再大也不会因为宽度而超过屏幕的宽度.

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

将eclipse项目转为maven项目的时候,编译时遇到 “非法字符: \65279”的报错. 出错内容是: *.java:1: 非法字符: \65279    [javac] package com.*.*;    [javac] ^    [javac] 1 错误 对于这个错误,下意识的认为是文件的第一行有隐藏字符.于是把第一行删掉重新添加上,结果依然报同样的错. 继续分析认为是文件编码格式的问题,但具体问题出在那里并没有一个明确的概念,工程使用的UTF-8编码格式. 后面上网看了,发现文件

GitHub上传文件不能超过100M的解决办法

上传项目到GitHub上,当某个文件大小超过100M时,就会上传失败,因为默认的限制了上传文件大小不能超过100M.如果需要上传超过100M的文件,就需要我们自己去修改配置. 首先,打开终端,进入项目所在的文件夹: 输入命令:git config http.postBuffer 524288000 之前git中的配置是没有这一项的,执行完以上语句后输入:git config -l 可以看到配置项的最下面多出了一行我们刚刚配置的内容. (52428000=500×1024×1024,即500M)