还是存储过程问题

sxq129601 2009-11-27 03:21:42
代码大致思路如下:
open d1;
LOOP
if userCode is null then
FETCH d1
INTO d;
Exit When d1%Notfound;
end if;
select count(*)
into num3
from ec_quantity_list_history t
where t.user_code = d.user_code
and t.electri_quantity_type = 2
and t.electri_fee_month = eletricFeeMonth;--问题是这里,打开游标D1,会有多个user_code。所以这句会有问题。不知道怎么修改,放在哪做判断?
end loop;
close d1;
if num3 = 1 then
INSERT
ELSIF NUM3>1 then
open e1;
LOOP
if userCode is null then
FETCH e1
INTO e;
Exit When e1%Notfound;
end if;
insert
end loop;
close e1;


在线等
...全文
191 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
okishu 2009-11-28
  • 打赏
  • 举报
回复
定义游标d1的时候,要有groupby usercode,才能够保证不出现重复数据。
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
那怎么修改。
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
你的代码中,开始的那个LOOP循环,循环n次以后再运行下面的代码,num3是不是早都改变了??我觉得应该在循环内部看num3?=1。并且对于相同的usercode,num3已经累加过(相同usercode出现的次数)。
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
哎搞不懂
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
16楼说的正是我在14楼说的后者,楼主认为需求是后者??
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
是后者!
我在10楼说的那种方法应该可以,还要判断每次打开的游标usercode值是否和上次相同,如果相同就num:=num3+1。而且大前提还要定义游标的时候 order by usercode。个人觉得你的LOOP有点问题,但也不好说问题在哪。你说出了165条数据,应该是LOOP。我平时的后台代码风格和你的不太一样。
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
查到了没重复的啊
phoenix_qiqi 2009-11-27
  • 打赏
  • 举报
回复
有重复的记录是因为你的course d1 中的 user_code 又重复的
感觉应该在定义course d1的时候就把重复的 user_code 去掉
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
是后者
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
你的意思是查ec_quantity_list_history表里有几条(num3)和USERCODE 相等的数据?
还是查游标里相同的USERCODE重复了几次(num3)?
如果是前者,你的程序就是取游标值的时候出问题了,
如果是后者,代码就有问题。
我理解你的意思是前者,是吗??
(个人想法)
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
不对啊 ,你理解错了啊。当USERCODE =1 时,COUNT(*),查=1时有几条记录,如果1条就运行一个代码。运行多条,就另一个。然后当USERCODE=2时。。。和上面一样
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
再次确认一下你的需求
USERCODE NAME
1 A
1 C
1 C
2 SDA
2 DASD
2 DADA
3 DAD
打开游标,因为有3个1,所以num3=3,执行。。。
因为有3个2,所以num3=3,执行。。。
因为有1个3,所以num3=1,执行。。。 ??
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
需求是要,查到一个USECODE一条记录的运行一个代码。多条的运行另一个代码。不是+1的问题。9楼的和我一开始写一样,但出现重复数据
dbms_output.put_line(num3||' '||d.user_code);

if num3 = 1 then

我打印了一下,应该出现下面的情况,每个一个


1 02530104
1 02536366.2
1 02530080
1 02536236
1 02536366
1 02536409
1 02543200
1 02530105
1 02536236.3
1 02536426
1 02552513
1 02530104

但事实他上面的数据重复了15次,,11条数据变165条了
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
应该判断select能否取出数据,如果能则num3自加1,而且不需要写 count(*) into num3了
phoenix_qiqi 2009-11-27
  • 打赏
  • 举报
回复
select count(*)
into num3
from ec_quantity_list_history t
where t.user_code = d.user_code
and t.electri_quantity_type = 2
and t.electri_fee_month = eletricFeeMonth;--问题是这里,打开游标D1,会有多个user_code。所以这句会有问题。不知道怎么修改,放在哪做判断?

if num3 = 1 then
INSERT
ELSIF NUM3>1 then
open e1;
LOOP
if userCode is null then
FETCH e1
INTO e;
Exit When e1%Notfound;
end if;
insert
end loop;
close e1;


end loop;
close d1;
opps_zhou 2009-11-27
  • 打赏
  • 举报
回复
select count(*) 语句后面加一个 group by usercode 不就行了吗?
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
对就是这样的,其实很简单。但我不知道。循环有问题,数据超出很多
opps_zhou 2009-11-27
  • 打赏
  • 举报
回复
我先想问一下,你是不是想知道某一个 usercode 在 ec_quantity_list_history 里出现的次数?
然后根据这个出现的次数,如果仅出现一次,那么做一种操作,超过一次做另一种操作???
sxq129601 2009-11-27
  • 打赏
  • 举报
回复
楼上的和我问题没关系。。
haijingtangsunyan 2009-11-27
  • 打赏
  • 举报
回复
不知道你开始加了那一段判断语句FETCH d1 INTO d; 有什么用。
直接FOR d1_ IN d1 LOOP
......
where t.user_code = d1_.user_code
...... 就可以了呀
加载更多回复(3)

3,496

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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