代码大致思路如下:
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;
在线等
          

解决方案 »

  1.   

    t.user_code = d.user_code(+)
    ???不太明白你的意思
      

  2.   

    我希望的是按每个user_code ,然后COUNT(*),然后依次进行下去
      

  3.   

    比如说游标打开后数据是这样:
    USERCODE   NAME
    1          A
    1          C
    1          C
    2          SDA
    2          DASD
    2          DADA
    3          DAD
    我要依次COUNT(*),比如第1次是3,然后下面判断是否>1
      

  4.   

    不知道你开始加了那一段判断语句FETCH d1 INTO d; 有什么用。
    直接FOR d1_ IN d1 LOOP
             ......
            where t.user_code = d1_.user_code
             ...... 就可以了呀
      

  5.   

    我先想问一下,你是不是想知道某一个 usercode 在 ec_quantity_list_history 里出现的次数?
    然后根据这个出现的次数,如果仅出现一次,那么做一种操作,超过一次做另一种操作???
      

  6.   

    select count(*) 语句后面加一个 group by usercode 不就行了吗?
      

  7.   

    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; 
      

  8.   

    应该判断select能否取出数据,如果能则num3自加1,而且不需要写 count(*) into num3了
      

  9.   

    需求是要,查到一个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条了
      

  10.   

    再次确认一下你的需求
    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,执行  ??
      

  11.   

    不对啊 ,你理解错了啊。当USERCODE  =1 时,COUNT(*),查=1时有几条记录,如果1条就运行一个代码。运行多条,就另一个。然后当USERCODE=2时和上面一样
      

  12.   

    你的意思是查ec_quantity_list_history表里有几条(num3)和USERCODE 相等的数据?
    还是查游标里相同的USERCODE重复了几次(num3)?
    如果是前者,你的程序就是取游标值的时候出问题了,
    如果是后者,代码就有问题。
    我理解你的意思是前者,是吗??
    (个人想法)
      

  13.   

    有重复的记录是因为你的course  d1 中的 user_code  又重复的
    感觉应该在定义course  d1的时候就把重复的 user_code  去掉
     
      

  14.   

    是后者! 
    我在10楼说的那种方法应该可以,还要判断每次打开的游标usercode值是否和上次相同,如果相同就num:=num3+1。而且大前提还要定义游标的时候 order by usercode。个人觉得你的LOOP有点问题,但也不好说问题在哪。你说出了165条数据,应该是LOOP。我平时的后台代码风格和你的不太一样。
      

  15.   

    你的代码中,开始的那个LOOP循环,循环n次以后再运行下面的代码,num3是不是早都改变了??我觉得应该在循环内部看num3?=1。并且对于相同的usercode,num3已经累加过(相同usercode出现的次数)。
      

  16.   

    定义游标d1的时候,要有groupby usercode,才能够保证不出现重复数据。