帮我看下这段代码有没有问题?

hahahjx 2009-10-17 08:54:55
create or replace function F_ARPU_3MONTH( v_serv_id in number)
return number
is
AVG_ARPU number := 0;
AVG_ARPU_TMP number := 0;
FISRT_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(sysdate,'yyyymm');
SECOND_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(sysdate-1,'yyyymm');
THIRD_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(sysdate-2,'yyyymm');
begin
begin
execute immediate 'select sum(ysje) into AVG_ARPU from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id;
exception
when no_data_found then
AVG_ARPU := 0;
end;
begin
execute immediate 'select sum(ysje) into AVG_ARPU from '||SECOND_MONTH||' where SERV_ID = '||v_serv_id;
exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
AVG_ARPU := AVG_ARPU + AVG_ARPU_TMP;
AVG_ARPU_TMP := 0;
begin
execute immediate 'select sum(ysje) into AVG_ARPU from '||THIRD_MONTH||' where SERV_ID = '||v_serv_id;
exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
AVG_ARPU := (AVG_ARPU + AVG_ARPU_TMP) / 3;
return AVG_ARPU;

end F_ARPU_3MONTH;


请大家帮我看看这段代码有没有问题,我在过程里面调用时老是11行出异常
...全文
61 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
inthirties 2009-10-17
  • 打赏
  • 举报
回复
execute immediate 'select sum(ysje) into AVG_ARPU from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id;
改成
execute immediate 'select sum(ysje) from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU;

还有就是报的是什么错,

对象不存在,还是什么其他的错。

把你运行时的错误提示帖上来看看,


hahahjx 2009-10-17
  • 打赏
  • 举报
回复
谢谢,问题已经找到了
小灰狼W 2009-10-17
  • 打赏
  • 举报
回复
。。execute语句注释掉运行的时候要补一句null;
否则begin..end;中没有任何语句会出错
小灰狼W 2009-10-17
  • 打赏
  • 举报
回复
看看output输出的字符串是否是你想要的
再执行,看看有什么错误提示
小灰狼W 2009-10-17
  • 打赏
  • 举报
回复
还有别的错误,比如月份不能用sysdate-1这样减的只有1天
还有下面参数好像写错了,into的对象应该是AVG_ARPU_TMP吧,不过这都不是语法问题,是逻辑问题
create or replace function F_ARPU_3MONTH( v_serv_id in number) 
return number
is
AVG_ARPU number := 0;
AVG_ARPU_TMP number := 0;
FISRT_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(sysdate,'yyyymm');
SECOND_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(add_months(sysdate,-1),'yyyymm');
THIRD_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(add_months(sysdate,-2),'yyyymm');
begin
begin
execute immediate 'select sum(ysje) from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU;
exception
when no_data_found then
AVG_ARPU := 0;
end;
begin
execute immediate 'select sum(ysje) from '||SECOND_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU_TMP ;
exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
AVG_ARPU := AVG_ARPU + AVG_ARPU_TMP;
begin
execute immediate 'select sum(ysje) from '||THIRD_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU_TMP;
exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
AVG_ARPU := (AVG_ARPU + AVG_ARPU_TMP) / 3;
return AVG_ARPU;

end F_ARPU_3MONTH;

先不要用insert,先改成过程找出错误以便调试:
declare
v_serv_id number:=121; --赋个值测试用
AVG_ARPU number := 0;
AVG_ARPU_TMP number := 0;
FISRT_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(sysdate,'yyyymm');
SECOND_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(add_months(sysdate,-1),'yyyymm');
THIRD_MONTH varchar2(30) :='tjbb10.real_srkh_kh_'||to_char(add_months(sysdate,-2),'yyyymm');
begin
begin
-- execute immediate 'select sum(ysje) from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU;
--先将字符串用output输出看看是否正确,没问题再执行execute..

exception
when no_data_found then
AVG_ARPU := 0;
end;
begin
-- execute immediate 'select sum(ysje) from '||SECOND_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU_TMP ;

exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
AVG_ARPU := AVG_ARPU + AVG_ARPU_TMP;
begin
--execute immediate 'select sum(ysje) from '||THIRD_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU_TMP;
exception
when no_data_found then
AVG_ARPU_TMP := 0;
end;
dbms_output.put_line(AVG_ARPU := (AVG_ARPU + AVG_ARPU_TMP) / 3);
dbms_output.put_line( 'select sum(ysje) from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id);
dbms_output.put_line('select sum(ysje) from '||SECOND_MONTH||' where SERV_ID = '||v_serv_id);
dbms_output.put_line('select sum(ysje) from '||THIRD_MONTH||' where SERV_ID = '||v_serv_id);

end ;

hahahjx 2009-10-17
  • 打赏
  • 举报
回复
insert into crm_in_tel_tmp --插入到临时表中
(
DATA_DAY,
SERV_ID,
arpu_3month,
is_arrear,
is_17909_package,
e6_disc,
is_super_radiophone,
tel_addvalue,
load_date
)
values
(
to_number(to_char(sysdate-1,'yyyymmdd')),
tmp_serv_id,
F_ARPU_3MONTH(tmp_serv_id),
to_is_arrear(tmp_serv_id),
to_is_17909(tmp_serv_id),
to_is_e6(tmp_serv_id),
to_is_super_radiophone(tmp_serv_id),
to_tel_addvalue(tmp_serv_id),
sysdate
);

这个是插入语句
hahahjx 2009-10-17
  • 打赏
  • 举报
回复
那样也报错了
小灰狼W 2009-10-17
  • 打赏
  • 举报
回复
下面的也一样,into 。。要写到外面来
小灰狼W 2009-10-17
  • 打赏
  • 举报
回复
execute immediate 'select sum(ysje) into AVG_ARPU from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id;
改成
execute immediate 'select sum(ysje) from '||FISRT_MONTH||' where SERV_ID = '||v_serv_id into AVG_ARPU ;

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧