文档章节

ORACLE字符串缓冲区太小解决方案

francis-x
 francis-x
发布于 2013/07/24 16:16
字数 380
阅读 15873
收藏 2

今天遇到一个字符串缓冲区太小的问题的,起因在于使用了ORACLE的聚合拼接函数WM_CONCAT,报错信息如下:

### Error querying database.  Cause: java.sql.SQLException: ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 "WMSYS.WM_CONCAT_IMPL", line 30


实际报错的SQL异常复杂,现抽取出来大概是这样子:

SELECT WMSYS.WM_CONCAT(DISTINCT COMPNAME) FROM 
(SELECT * FROM 
(SELECT NEWSCODE,COMPCODE FROM T_NEWS_COMPANY_BD) A
INNER JOIN TQ_COMP_INFO C
ON A.COMPCODE = C.COMPCODE) GROUP BY NEWSCODE

由于按NEWSCODE分组后,有部分组中COMPNAME数量过多,导致拼接后大于4000个字符,而ORACLE又太笨,不会直接加省略号忽略后面的结果,而是选择报错.

在网上也搜了一些解决方案,要么是自定义聚合函数,要么是用CLOB字段处理,或者再嵌套几层过滤掉过多的记录,感觉都太过于复杂,不便迅速解决问题。思考了好久,终于想到使用PARTITION BY来解决这个问题,解决后的SQL如下:

SELECT WMSYS.WM_CONCAT(DISTINCT CASE WHEN RANK < 100 THEN COMPNAME END) FROM 
(SELECT * FROM 
(SELECT NEWSCODE,COMPCODE,RANK() OVER(PARTITION BY NEWSCODE ORDER BY COMPCODE) RANK FROM T_NEWS_COMPANY_BD) A
INNER JOIN TQ_COMP_INFO C
ON A.COMPCODE = C.COMPCODE) GROUP BY NEWSCODE

这种方法需要修改的SQL代码量极少,如果不在乎后面省略掉的字段与PARTITION BY所造成的略微的性能损失的话,个人觉得是最佳解决方案。

如果有朋友有更好的解决方案,麻烦告诉我。


© 著作权归作者所有

francis-x

francis-x

粉丝 24
博文 25
码字总数 25066
作品 0
南通
高级程序员
私信 提问
加载中

评论(1)

Kayda
Kayda
我想试一下你的方法
oracle sql clob 查询重复数据,多字段

clob字段在查询时是无法 group by 和 distinct 的,所以如果要根据clob查找重复的数据是很麻烦的,网上大多提出要用DBMSLOB.SUBSTR 来解决,DBMSLOB.SUBSTR 把clob转换成字符串段再进行group...

walala_Lee
2013/09/24
2.5K
0
SQL的高效写法,看看你做到了几条

1、尽量少用IN操作符 基本上所有的IN操作符都可以用EXISTS代替,在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑 2、尽量用NOT EXISTS或者外连接替代NOT IN操作符 因为NOT IN不能应...

Ryan-瑞恩
2012/09/25
167
1
Oracle函数返回超长字符串问题

Oracle函数返回字符串时,如果字符串长度过大(约超过1850),则会出现字符缓冲区不足的错误。 可以采用出参的方式解决,在编程中再把各出参的值组合。一般编程语言中的字符串可以足够长。 ...

夏春涛
2005/08/13
0
0
nginx服务器出现504 gateway time-out怎么解决

做网站的同学经常会发现一些nginx服务器访问时候提示504 Gateway Time-out错误,而出现这种错误有两种情况,第一种可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastc...

Code辉
2018/08/28
62
0
oracle log file switch (checkpoint incomplete) 等待事件

这个等待事件在繁忙的系统很容易出现,要想解决这个问题就得了解为啥会出这个问题。 说到redolog就必须得说下oracle 日志体系,oracle 默认必须有3组日志,每组日志是循环写的,oracle在写入...

hnairdb
01/22
13
0

没有更多内容

加载失败,请刷新页面

加载更多

ES5

什么是ES5:比普通js运行要求更加严格的模式 为什么:js语言本身有很多广受诟病的缺陷 如何:在当前作用域的顶部添加:"use strict" 要求: 1、禁止给未声明的变量赋值 2、静默失败升级为错误...

wytao1995
49分钟前
7
0
c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
7
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
7
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部