TO hushuangyang(hushuangyang) : 不是语句的问题,我是作了一个N次的循环拼成了个Insert 语句,无论循环次数多少这个语句的形式都是一样的。
我遇到的也是这样,把varchar2(长度) 长度值改大,足够的字符串长
v_XmbhList:=''; v_XmbhSumList:=''; for v_i in 1..100 loop if v_i>=10 then v_xmbh:='XM'||to_char(v_i); else v_xmbh:='XM'||'0'||to_char(v_i); end if; v_XmbhList:=v_XmbhList||' , '||v_xmbh; v_XmbhSumList:=v_XmbhSumList||' ,(A.SUM('||v_xmbh||')';
v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') ' ||' select B.jgbh,C.jgmc,'''||v_HZND||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C' ||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||v_HZND||''' group by B.jgbh,c.jgmc ';
DBMS_OUTPUT.PUT(v_sql); execute immediate v_sql;
dbms_output.put 函数只能输出最多255个字符的字符串,你的字符串超长了
楼上的,你说的是DBMS_OUTPUT.PUT_LINE吧! 下面一句做字符串连接的也报错呀!
declare i integer; v_sql varchar2(10000); v_Xmbh varchar2(10000); v_XmbhList varchar2(10000); v_XmbhsumList varchar2(10000); begin v_XmbhList:=''; v_XmbhSumList:=''; for v_i in 1..100 loop if v_i>=10 then v_xmbh:='XM'||to_char(v_i); else v_xmbh:='XM'||'0'||to_char(v_i); end if; v_XmbhList:=v_XmbhList||' , '||v_xmbh; v_XmbhSumList:=v_XmbhSumList||' ,(A.SUM('||v_xmbh||')';
v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') ' ||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C' ||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc ';
v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') ' ||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C' ||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc '; 把这一句output出来在sqlplus中提交,好象有问题?
谢谢各位大侠!dbms_output.put 只是我调试用的代码,它是有长度限制,可是这一句: v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') ' ||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C' ||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc ';这一句我只是做了一个字符串连接,为什么会报错? 如果XmbhSumList短一些的话就不会报错。 我拼成的这个SQL有没问题另当别论,因为我还没有执行这个Sql!
另外,是不是你用于存放动态sql串的变量的长度不够啊,
否则就会报“数字或值错误”,我也遇到过。
这个串有1200个字符,我定义成string(2000),varchar2(2000),varchar2(5000)都不行,报一样的错误。
同样的语句,短字符串就可以,所以也不是类型转换的问题。
是不是服务器有可以设置字符串缓冲区大小的地方?
这个问题应该出现你的sql 语句上,我碰到过很多次。
你调试一下就知道了
不是语句的问题,我是作了一个N次的循环拼成了个Insert 语句,无论循环次数多少这个语句的形式都是一样的。
v_XmbhSumList:='';
for v_i in 1..100 loop
if v_i>=10 then
v_xmbh:='XM'||to_char(v_i);
else
v_xmbh:='XM'||'0'||to_char(v_i);
end if;
v_XmbhList:=v_XmbhList||' , '||v_xmbh;
v_XmbhSumList:=v_XmbhSumList||' ,(A.SUM('||v_xmbh||')';
end loop;
dbms_output.put(v_xmbhsumlist); --执行这一句就会报错,如果把这一句注掉,那么下一句就会报错!报相同的错误。
v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') '
||' select B.jgbh,C.jgmc,'''||v_HZND||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C'
||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||v_HZND||''' group by B.jgbh,c.jgmc ';
DBMS_OUTPUT.PUT(v_sql);
execute immediate v_sql;
下面一句做字符串连接的也报错呀!
i integer;
v_sql varchar2(10000);
v_Xmbh varchar2(10000);
v_XmbhList varchar2(10000);
v_XmbhsumList varchar2(10000);
begin
v_XmbhList:='';
v_XmbhSumList:='';
for v_i in 1..100 loop
if v_i>=10 then
v_xmbh:='XM'||to_char(v_i);
else
v_xmbh:='XM'||'0'||to_char(v_i);
end if;
v_XmbhList:=v_XmbhList||' , '||v_xmbh;
v_XmbhSumList:=v_XmbhSumList||' ,(A.SUM('||v_xmbh||')';
end loop;
--dbms_output.put(v_xmbhsumlist); --执行这一句就会报错,如果把这一句注掉,那么下一句就会报错!报相同的错误。
v_sql:=' insert into t_yjjljghz (jgbh,dwmc,hznd '||v_XmbhList||') '
||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C'
||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc ';
--DBMS_OUTPUT.PUT(v_sql); --注释掉
--execute immediate v_sql;
end;--上面的语句执行没有任何错误,可见是DBMS_OUTPUT.PUT函数的问题
||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C'
||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc ';
把这一句output出来在sqlplus中提交,好象有问题?
dbms_output.put函数对输出字符串的长度的限制
||' select B.jgbh,C.jgmc,'''||222||''''||v_XmbhSumList||' from t_gryjjlhz A,t_ygjbxx B ,t_jg C'
||' where A.ygid=B.ygid and b.jgbh=c.jgbh and A.hznd='''||222||''' group by B.jgbh,c.jgmc ';这一句我只是做了一个字符串连接,为什么会报错?
如果XmbhSumList短一些的话就不会报错。
我拼成的这个SQL有没问题另当别论,因为我还没有执行这个Sql!
是因为dbms_output.put的参数超长抱的.v_xmbhsumlist拼的也有问题(一下是其中一段,显然是错误的):
,(A.SUM(XM01) ,(A.SUM(XM02) ,(A.SUM(XM03) ,(A.SUM(XM04) ,(A.SUM(XM05)
,(A.SUM(XM06) ,(A.SUM(XM07) ,(A.SUM(XM08) ,(A.SUM(XM09) ,(A.SUM(XM10)
,(A.SUM(XM11) ,(A.SUM(XM12)