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

时间:2023-01-03 23:40:58
各位大虾:小弟今天在执行这个存储过程是出现这个错误该怎么解决(如题)
我在调试过程中发现当执行到:    v_sql := v_sql || ' and ((ServiceChainIndex = 0) And (EndReason<>''7'') And (EndReason<>''515'')) OR ((ServiceChainIndex = 1) AND (EndReason <> ''11'') AND';
时v_sql的值为 (long value)在这之前还是有值的
全部执行完出项这个错误

ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 148
ORA-06512: 在 line 2

我将缓冲区大小设置为最大 32000 还是暴这个错误,请各位大虾帮忙解决下。
等待。。。。

create or replace procedure Log0001_TotalCallIn
(
 P_StartTime varchar2,
 p_StopTime varchar2,
 v_cur out PackageSYS_TotalCllIn.cur_SYS_TotalCllIn,
 p_TimeType int
)
is
 v_sql varchar2(4000) :='';
begin   
 v_sql := 'Select A.StartTime as 时间分组,nvl(A.Counts,0) as 呼入总次数,nvl(B.Counts,0) as 成功总次数,nvl(C.Counts,0) as 失败总次数,';
    v_sql := v_sql || ' nvl(D.Counts,0) as 转人工总次数,nvl(E.Counts,0) as 转人工成功次数,';
    v_sql := v_sql || ' (case when nvl(D.Counts,0)=0 then 0 else nvl(E.Counts,0)*100/D.Counts end) as 转人工接通率,(nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数 from';
    v_sql := v_sql || ' (select to_char(StartTime,''yyyy-mm-dd hh24'') as StartTime,count(*) as Counts from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and ServiceChainIndex = 0 group by to_char(StartTime,''yyyy-mm-dd hh24'') ) A left outer join ';
    v_sql := v_sql || ' (select to_char(StartTime,''yyyy-mm-dd hh24'') as StartTime,count(*) as Counts from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and (ServiceChainIndex = 1) AND (EndReason = ''11'') AND (ISO <> ''T'')';
    v_sql := v_sql || ' group by to_char(StartTime,''yyyy-mm-dd hh24'') ) B  on A.StartTime=B.StartTime  left outer join';
    v_sql := v_sql || ' (select to_char(StartTime,''yyyy-mm-dd hh24'') as StartTime,count(*) as Counts from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and ((ServiceChainIndex = 0) And (EndReason<>''7'') And (EndReason<>''515'')) OR ((ServiceChainIndex = 1) AND (EndReason <> ''11'') AND';
    v_sql := v_sql || ' (ISO <> ''T'') And (SPType is null)) group by to_char(StartTime,''yyyy-mm-dd hh24'') ) C on A.StartTime=C.StartTime  left outer join';
    v_sql := v_sql || ' (select to_char(StartTime,''yyyy-mm-dd hh24'') as StartTime,count(distinct SRID) as Counts from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and ServiceChainIndex = 0 and SRID in (Select distinct SRID  from SRRecord where';    
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and (EndReason = 21 or EndReason = 22 or EndReason = 23 or EndReason = 24 or EndReason = 25';
    v_sql := v_sql || ' or EndReason = 26 or EndReason = 27 or EndReason = 28 or EndReason = 29) and ISO<>''T'')';
    v_sql := v_sql || ' group by to_char(StartTime,''yyyy-mm-dd hh24'') ) D on A.StartTime=D.StartTime left outer join';
    v_sql := v_sql || ' (select to_char(StartTime,''yyyy-mm-dd hh24'') as StartTime,count(distinct SRID) as Counts from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and ServiceChainIndex = 0 and SRID in (Select distinct SRID  from SRRecord where';
    v_sql := v_sql || ' StartTime>='''||to_date(p_StartTime,'yyyy-mm-dd hh24:mi:ss')||''' and StartTime<='''||to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')||'''';
    v_sql := v_sql || ' and (EndReason = 21 ) and ISO<>''T'') group by to_char(StartTime,''yyyy-mm-dd hh24'')';
    v_sql := v_sql || ' ) E on A.StartTime=E.StartTime order by A.StartTime ';
   DBMS_OUTPUT.put_line(v_sql);
  open v_cur for v_sql;
end Log0001_TotalCallIn;

11 个解决方案

#1


你这个动态SQL拼接超过了dbms_output.put_line()的最大字符长度要求
我一般的做法是将拼接的结果insert到一个表,你可以试试
create table rs (sqlstr varchar2(4000));

。。。。。
v_sql := v_sql || ' ) E on A.StartTime=E.StartTime order by A.StartTime ';
   --DBMS_OUTPUT.put_line(v_sql);
   insert into rs values(v_sql);
   commit;
  open v_cur for v_sql;
......
......

#2


dbms_output.enable(1000000);
这样试试看看有用不?

#3


引用 2 楼 zhuomingwang 的回复:
dbms_output.enable(1000000);
这样试试看看有用不?

使用.enable(1000000);将不会有DBMS输出了。。

#4


引用楼主 jersslong 的回复:
各位大虾:小弟今天在执行这个存储过程是出现这个错误该怎么解决(如题)
我在调试过程中发现当执行到:    v_sql := v_sql || ' and ((ServiceChainIndex = 0) And (EndReason<>''7'') And (EndReason<>''515'')) OR ((ServiceChainIndex = 1) AND (EndReason <> ''……


-- 只有一句话:写存储过程的水平太差!

#5


4楼得大虾,我才接触oracle几天工夫的。。
我要是像您这么牛我早就不接触开发了。。

#6


你设成18000试一下。

#7


楼主真乃神人也。我宁愿去打酱油,也不敢看这代码啊。这代码以后可怎么维护啊。。。

#8


我也没办法了 。。 一百个proc 老总说这月24号从sqlserver移植搭到oracle上
上线。。。 还有10来天。

#9


跨数据库移植要慎重哦,这么短的时间够呛.

#10


谁让我是搞开发的,不是老总啊。结账啦。。。

#11


问题已经解决,多谢大家关注!
循环v_sql,每行小于255字节就换行打印。。

#1


你这个动态SQL拼接超过了dbms_output.put_line()的最大字符长度要求
我一般的做法是将拼接的结果insert到一个表,你可以试试
create table rs (sqlstr varchar2(4000));

。。。。。
v_sql := v_sql || ' ) E on A.StartTime=E.StartTime order by A.StartTime ';
   --DBMS_OUTPUT.put_line(v_sql);
   insert into rs values(v_sql);
   commit;
  open v_cur for v_sql;
......
......

#2


dbms_output.enable(1000000);
这样试试看看有用不?

#3


引用 2 楼 zhuomingwang 的回复:
dbms_output.enable(1000000);
这样试试看看有用不?

使用.enable(1000000);将不会有DBMS输出了。。

#4


引用楼主 jersslong 的回复:
各位大虾:小弟今天在执行这个存储过程是出现这个错误该怎么解决(如题)
我在调试过程中发现当执行到:    v_sql := v_sql || ' and ((ServiceChainIndex = 0) And (EndReason<>''7'') And (EndReason<>''515'')) OR ((ServiceChainIndex = 1) AND (EndReason <> ''……


-- 只有一句话:写存储过程的水平太差!

#5


4楼得大虾,我才接触oracle几天工夫的。。
我要是像您这么牛我早就不接触开发了。。

#6


你设成18000试一下。

#7


楼主真乃神人也。我宁愿去打酱油,也不敢看这代码啊。这代码以后可怎么维护啊。。。

#8


我也没办法了 。。 一百个proc 老总说这月24号从sqlserver移植搭到oracle上
上线。。。 还有10来天。

#9


跨数据库移植要慎重哦,这么短的时间够呛.

#10


谁让我是搞开发的,不是老总啊。结账啦。。。

#11


问题已经解决,多谢大家关注!
循环v_sql,每行小于255字节就换行打印。。