100分 OracleXEUniv ORA-06502:PL/SQL 数字或值错误:字符串缓冲区太小

时间:2023-01-03 23:36:18
做完了一个项目 在导出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'
这个怎么解决那个缓冲的大小问题呢 网上找了好多都不能实现 谁能帮忙解决一下谢了 

7 个解决方案

#1


帮帮忙吧

#2


这个SQL还蛮复杂... 应该是长度过大导致的.

#3


你得贴出你的字段定义才行。

#4


WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)

注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。

#5


引用 4 楼  的回复:
WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)

注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
可是怎么更改字符串缓冲区的大小呢 纠结了两天了 

#6


WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/

#7


引用 6 楼  的回复:
WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/

好的 试试 谢了哈 

#1


帮帮忙吧

#2


这个SQL还蛮复杂... 应该是长度过大导致的.

#3


你得贴出你的字段定义才行。

#4


WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)

注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。

#5


引用 4 楼  的回复:
WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)

注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
可是怎么更改字符串缓冲区的大小呢 纠结了两天了 

#6


WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/

#7


引用 6 楼  的回复:
WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/

好的 试试 谢了哈