select count(*) into var2 from b where b.col2=a.col1;
当然一样了,总是表b的记录数,因为你要它这样的嘛。改一下后,执行一遍:
i:=1
loop
  fetch CUR  into var1;
  select count(*)+i into var2 from b where b.col2=a.col1;
  insert into c ( ) values(col1,var2);
  i:=i+1;
  EXIT when cur%notfound;
end loop;

解决方案 »

  1.   

    你的程序select count(*) into var2 from b where b.col2=a.col1;一句是没问题的
    肯定是其他操作有错误
    下面这段程序都可以运行(结果也是正确的)
      1  declare
      2  i integer:=0;
      3  begin
      4  select count(*) into i from newtest where ncol>0;
      5  dbms_output.put_line(i);
      6* end;
    SQL> /
    6PL/SQL 过程已成功完成。
      

  2.   

    to: BlueskyWide(谈趣者) 
    谢谢你指出来,不过这可能是我提炼的予具有问题:原语句应该是:
    select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=a.col1;count(*) 的值应该是随着条件a.col1的变化而变化的不好意思,我的过错。
    还请再指导一二。。
    to:keyset(asdf) 这个语句是没有错误。
    打印出的变量也是正确的。
    但第二次使用var2的时候,var2得值就可能出错。
    在之前的存储过程中,也遇到过这样的第二次引用变量就出错的问题(或者作为条件,或者直接插入一个表中)。我定义了一个中间变量var3,在into var2之后,再用 var3:=var2;
    然后用var3,就不会出错了。但这次实验好长时间似乎不管用了。仁兄能提出解决办法吗?
    多谢多谢,今天要解决掉他。明天要用啊。
    俺是菜鸟,多多指教啊。。
      

  3.   

    to_gree001(253),你这样查询select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=a.col1;行吗?
    既然你先用了
    sql1:='select col1 from a';
     open CUR for ssql;
            loop
                fetch CUR  into var1;
    估计你是要查每个var1对应的数量
    select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=a.col1;
    要改为select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=var1
      

  4.   

    xzou大哥是我写错了。。多谢大哥指出我的程序是用的是var1select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=var1是这样的,但还是出错。发帖的时候写的太急了点。
    就这一个问题搞了我两天多时间了,心情有些急躁。
    大哥多指导。。
      

  5.   

    这个,逻辑上好象是没有错的。
    做游标取出a.col1的值赋给var1,对应每个var1算出一个统计数赋给var2,
    然后存到c表中。
    不象会出错的样子。另外insert时最好用insert into c values(var1,var2);这样。
      

  6.   

    to:snowy_howe(天下有雪) 谢谢老兄,我insert时是这样的:insert into c(col1,col2) values(var1,var2);
      

  7.   

    1.原问题解决方案如下:
    insert into c ( ) values(col1,var2)
     commit;--在此处加上该语句即可
    EXIT when cur%notfound;
       end loop;
       close CUR;
    2.还有一点修改建议:
    fetch CUR  into var1;
    EXIT when cur%notfound;  --最好把此句放在紧跟fetch后面,否则最后一条记录会输出两次
      

  8.   

    create procedure get
    as
    cursor t_sor is
    select col1 from a;
    var2 number;
    begin
    for v_sor in t_sor loopselect count(*) into var2 from b,c where c.col3=b.col4 and b.col2=v_sor.col1;insert into c values(v_sor.col1,var2);
    end loop;
    end;
    /
      

  9.   

    更正:
    应将commit放在loop 循环体外面(即放在end loop 的下一句)
    否则在对表锁定操作时会出现问题
      

  10.   

    多谢 keyset(asdf) 兄:按你的说法做了。。
    但效果还是给原来的一样,如下:
    CREATE OR REPLACE PROCEDURE EDU.PROC_SMS_SENT_COUNT2
    AS
        BEGIN
    DECLARE    TYPE CUR_REF IS REF CURSOR;
        CUR CUR_REF;
        datehour varchar2(100);
        datehour1 varchar2(100);
        ssql varchar(2000);    org_id number(6);
        c number(2);
        d number(2);
        tcounter number(8);
        tcounter1 number(8);
        ggcounter number(8);
        ggcounter1 number(8);
        cccounter number(8);
        cccounter1 number(8);
        xxcounter number(8);
        xxcounter1 number(8);
        bzcounter number(8);
        bzcounter1 number(8);    tcounter2 number(8);
        tcounter12 number(8);
        ggcounter2 number(8);
        ggcounter12 number(8);
        cccounter2 number(8);
        cccounter12 number(8);
        xxcounter2 number(8);
        xxcounter12 number(8);
        bzcounter2 number(8);
        bzcounter12 number(8);
        BEGIN
        select floor(sysdate-1-max(attime)) into c from sms_sent_count;
        d:=c-1;
        for q in reverse 0..d loop
        ssql := ' select id from  organization where status in (1,3) order by id';-- id=180';
        open CUR for ssql;
            loop
                fetch CUR  into org_id;
                for p in 1..22 loop
                  select to_char(sysdate-1-q,'yyyy/mm/dd') into datehour from dual;
                  select to_char(sysdate-3-q,'yyyy/mm/dd') into datehour1 from dual;                   if (p<10) then
                          datehour :=concat(concat(datehour,' 0'),p);
                          datehour1 :=concat(concat(datehour1,' 0'),p);
                       else
                           datehour :=concat(concat(datehour,' '),p);
                           datehour1 :=concat(concat(datehour1,' '),p);
                        end if;
             select COUNT(*) into tcounter from SMS_SENT_TMP a,message b,person c
                         where a.msg_id=b.id
                         and b.creator_id=c.id
                         and to_char(a.finishdate,'yyyy/mm/dd hh24')=''||datehour||''
                         and exists ( select p.mobile mobile
                         from person p, personunit pu,unit u
                         where p.id=pu.person_id
                         and c.mobile=p.mobile
                         and pu.unit_id=u.id
                         and u.org_id=''||org_id||'');
        if (tcounter>0) then --  如果有下行消息则继续进行                 INSERT INTO SMS_SENT_COUNT
            (
                ID,
                ORG_ID,
                TOTAL_SENT,
                TOTAL_RECED,
                GG,
                GG1,
                CC,
                CC1,
                XX,
                XX1,
                BZ,
                BZ1,
                ATTIME
            )
            VALUES
            (
                s_SMS_SENT_COUNT.nextval,
                org_id,
                tcounter,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                to_date(datehour,'yyyy/mm/dd hh24')
            );        end if;
            end loop;
            COMMIT;
           EXIT when cur%notfound;
           end loop;
            COMMIT;
           close CUR;
         end loop;
        COMMIT;
        EXCEPTION
        WHEN OTHERS THEN
        rollback;
        END;
    END;
    /
    如果ORG_ID为:1,2,3
    2 搜索出来的结果TCOUNTER为10
    1和3搜索出来的结果TCOUNTER为0
    则insert 到SMS_SENT_COUNT表的每个org_id对应的tcounter的值均为10。
    老兄及其他兄弟已经帮不少忙了。。
    明天,成功与否,都将转分。
    253一个先。。
      

  11.   

    不好意思,昨天太忙
    忘了结贴。。并谢keyset(asdf) 兄:
    你的方法是可行的。
    然后把org_id用个中间变量传送问题就避免了,原来主要问题是发生在fetch CUR  into org_id;是的变量传送。。
    而我一直专注于对下面这个变量tcounter的检查,测试
    select COUNT(*) into tcounter from SMS_SENT_TMP a,message b,person c问题解决了。但原因还不甚明了,因为插入的时候org_id其实是变化了的,只是对应搜出来的
    tcounter不变而已,只是加个中间变量就一切ok了。
    奇了怪了。。
    转分。
    并诚挚地感谢各位仁兄。