错误是 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时,就会出现字符串缓冲区太小。
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)
注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
#5
可是怎么更改字符串缓冲区的大小呢 纠结了两天了
#6
WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/
#7
好的 试试 谢了哈
#1
帮帮忙吧
#2
这个SQL还蛮复杂... 应该是长度过大导致的.
#3
你得贴出你的字段定义才行。
#4
WMSYS.WM_CONCAT(M.JD)
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)
注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
WMSYS.WM_CONCAT(SH_CLGCJL.FKSJ || ' ' ||S5.CNNAME || ' ' ||SH_CLGCJL.BYZD1)
注意观察你的这两句里的输入内容,有点问题,当输入的字符长度超过4000时,就会出现字符串缓冲区太小。
#5
可是怎么更改字符串缓冲区的大小呢 纠结了两天了
#6
WMSYS.WM_CONCAT返回varchar2,最多4000个字节,所以你只能想办法减少查询记录数,这样拼接起来字符串长度小于4000,
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/
或者自己写个函数,看看这个
http://blog.163.com/leo_wuya/blog/static/44451843201123023659183/
#7
好的 试试 谢了哈