巧用分析函数解决ORA-06502--字符串缓冲区太小

        现在有这么一个需求,业务单据上面有很多流程跟踪的信息,要显示在列表页面的一个字段中。可能出现一个问题,那就是如果合并的字段长度超过4000个字节,SQL语句会报错,ORA-06502  字符串缓冲区太小,即使你用substr()截取也是这样的错误。其实就是一个行转列的过程。那怎么解决这个问题,来做个试验:

drop table test;
create table test(
track_info_id number(10),
id number(10),
DESCR varchar2(1000)
);

insert into test values(4,100,RPAD('4',800,'4'));
insert into test values(5,100,RPAD('5',800,'5'));
insert into test values(6,100,RPAD('6',800,'6'));
insert into test values(2,100,RPAD('2',800,'2'));
insert into test values(3,100,RPAD('3',800,'3'));
insert into test values(1,100,RPAD('1',800,'1'));
commit;

 1. 先判断各行的DESCR加起来是否超过4000个字节,只取没有超过4000个字节的行数。

select ID,wmsys.wm_concat(DESCR)
  from (select ID,
               DESCR,
               sum(lengthb(DESCR||',')) over(partition by ID order by track_info_id asc) descr_length
          from test)
 where descr_length < 4000
 group by ID;

 

2. 这个跟上面的区别在于,只是如果合计超过4000个字节,只取最新的几个流程。

with t as(
  select * from (select ID,DESCR,track_info_id,
  sum(lengthb(DESCR||','))over(partition by ID order by  track_info_id desc) descr_length
          from test ) where descr_length<4000)
select ID,max(DEFECTDES) from
 (SELECT ID,
   wmsys.wm_concat(DESCR) over(partition by ID order by track_info_id) DEFECTDES
   from t) group by ID;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值