日期:2014-05-17  浏览次数:21298 次

100分 OracleXEUniv ORA-06502:PL/SQL 数字或值错误:字符串缓冲区太小
做完了一个项目 在导出excel的时候 报错 
错误是 ORA-06502:PL/SQL 数字或值错误:字符串缓冲区太小 和 ORA-06521:在“WMSYS.WM_CONCAT_IMPL”,LINE 30
sql语句是
SELECT DISTINCT FW.FWBH,FW.FWLX,FW.MGS,
  (SELECT MIN(SH_CLGCJL.CZSJ)FROM SH_CLGCJL, SH_BDSHFU 
  WHERE SH_CLGCJL.FWBH = SH_BDSHFU.PK1 AND SH_BDSHFU.PK1 = '1761A7C2E5855DF1CADDC3D445BC999D'
  GROUP BY SH_CLGCJL.FWBH) AS CZSJ,
  (SELECT MAX(SH_CLGCJL.FKSJ)
  FROM SH_CLGCJL, SH_BDSHFU
  WHERE SH_CLGCJL.FWBH = SH_BDSHFU.PK1 AND SH_BDSHFU.PK1 = '1761A7C2E5855DF1CADDC3D445BC999D'
  GROUP BY SH_CLGCJL.FWBH) AS FKSJ,
  FW.LXRBH,FW.LXFS,
  (SELECT S3.CNNAME AS FW_SLR FROM SH_CLGCJL JL LEFT JOIN SH_USER S3 ON (S3.ENNAME = JL.FW_SLR)
  WHERE FWBH = '1761A7C2E5855DF1CADDC3D445BC999D' AND ROWNUM = 1) AS FW_SLR,
  FW.NR,FW.BYZD2,
  S2.CNNAME AS BYZD3,
  (SELECT REPLACE(WMSYS.WM_CONCAT(M.JD), ',', '||') RESULT 
  FROM (SELECT REPLACE(WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1),',',
' || ') JD FROM SH_CLGCJL LEFT JOIN S_USER S5 ON (S5.ENNAME =SH_CLGCJL.FW_SLR) 
  WHERE SH_CLGCJL.FWBH ='1761A7C2E5855DF1CADDC3D445BC999D' AND S5.ENNAME = SH_CLGCJL.FW_SLR
  GROUP BY SH_CLGCJL.FKSJ) M) AS BYZD1,
FW.FKYJ,
FW.BZ,
FW.PK1
FROM SH_BDSHFU FW
LEFT JOIN S_DIC S2 ON (S2.TYPE1 = '完成情况' AND S2.ENNAME = FW.BYZD3),
 SH_CLGCJL JL
 WHERE FW.PK1 = JL.FWBH
AND FW.PK1 = '1761A7C2E5855DF1CADDC3D445BC999D'
AND FW.BYZD3 = '01'
这个怎么解决那个缓冲的大小问题呢 网上找了好多都不能实现 谁能帮忙解决一下谢了

------解决方案--------------------
WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)

注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
------解决方案--------------------
WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/