ORACLE字符串缓冲区太小解决方案
2013-07-24 16:16
399 查看
今天遇到一个字符串缓冲区太小的问题的,起因在于使用了ORACLE的聚合拼接函数WM_CONCAT,报错信息如下:
实际报错的SQL异常复杂,现抽取出来大概是这样子:
由于按NEWSCODE分组后,有部分组中COMPNAME数量过多,导致拼接后大于4000个字符,而ORACLE又太笨,不会直接加省略号忽略后面的结果,而是选择报错.
在网上也搜了一些解决方案,要么是自定义聚合函数,要么是用CLOB字段处理,或者再嵌套几层过滤掉过多的记录,感觉都太过于复杂,不便迅速解决问题。思考了好久,终于想到使用PARTITION BY来解决这个问题,解决后的SQL如下:
这种方法需要修改的SQL代码量极少,如果不在乎后面省略掉的字段与PARTITION BY所造成的略微的性能损失的话,个人觉得是最佳解决方案。
如果有朋友有更好的解决方案,麻烦告诉我。
### 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所造成的略微的性能损失的话,个人觉得是最佳解决方案。
如果有朋友有更好的解决方案,麻烦告诉我。
相关文章推荐
- java 将长度很长的字符串(巨大字符串超过4000字节)插入oracle的clob字段时会报错的解决方案
- "ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小"的解决,总结一下oracle开发的小经验
- 字符串缓冲区太小?--Oracle也谎报军情
- 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- oracle Array类型作为参数传入函数(存储过程) 大字符串参数解决方案
- Oracle PlSql 问题集锦 - 数字或值错误:字符串缓冲区太小【ORA-06502】
- 涂料化工行业:ORACLE EBS R12的解决方案经验总结(OPM项目)
- Oracle常见问题及解决方案
- oracle 如何计算中英文混合字符串占用的字节
- oracle函数+过程,解析字符串信息作为字段,并动态更新数据表
- Oracle包被锁定的原因分析及解决方案
- Oracle11-本地连接没问题,远程连接有问题解决方案
- c#,oracle的连接字符串
- Oracle百分比格式化问题与解决方案
- oracle 分割字符串 截取字符串
- oracle 连接字符串【各种连接字符串介绍】
- Oracle监听器不能启动的解决方案
- Oracle 无法监听 因目标主机或对象不存在 连接失败--解决方案
- oracle中分割字符串的方法
- oracle控制台服务无法启动解决方案