我在调试过程中发现当执行到: 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;
......
......
我一般的做法是将拼接的结果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
使用.enable(1000000);将不会有DBMS输出了。。
#4
-- 只有一句话:写存储过程的水平太差!
#5
4楼得大虾,我才接触oracle几天工夫的。。
我要是像您这么牛我早就不接触开发了。。
我要是像您这么牛我早就不接触开发了。。
#6
你设成18000试一下。
#7
楼主真乃神人也。我宁愿去打酱油,也不敢看这代码啊。这代码以后可怎么维护啊。。。
#8
我也没办法了 。。 一百个proc 老总说这月24号从sqlserver移植搭到oracle上
上线。。。 还有10来天。
上线。。。 还有10来天。
#9
跨数据库移植要慎重哦,这么短的时间够呛.
#10
谁让我是搞开发的,不是老总啊。结账啦。。。
#11
问题已经解决,多谢大家关注!
循环v_sql,每行小于255字节就换行打印。。
循环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;
......
......
我一般的做法是将拼接的结果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
使用.enable(1000000);将不会有DBMS输出了。。
#4
-- 只有一句话:写存储过程的水平太差!
#5
4楼得大虾,我才接触oracle几天工夫的。。
我要是像您这么牛我早就不接触开发了。。
我要是像您这么牛我早就不接触开发了。。
#6
你设成18000试一下。
#7
楼主真乃神人也。我宁愿去打酱油,也不敢看这代码啊。这代码以后可怎么维护啊。。。
#8
我也没办法了 。。 一百个proc 老总说这月24号从sqlserver移植搭到oracle上
上线。。。 还有10来天。
上线。。。 还有10来天。
#9
跨数据库移植要慎重哦,这么短的时间够呛.
#10
谁让我是搞开发的,不是老总啊。结账啦。。。
#11
问题已经解决,多谢大家关注!
循环v_sql,每行小于255字节就换行打印。。
循环v_sql,每行小于255字节就换行打印。。