有两张表,要从一张表按照一定的条件给第二张表填数据,第二张表只有有限行,即要用两个游标双重循环,从第一张表中读取一个数据,对第二个表进行判断,满足条件就写入,没有就跳出。以此类推,直到第二张表写满停止。现在我不知道怎么写第一个游标的结束语句,求大神!!!!

解决方案 »

  1.   

    不是很明白,为什么第二张表是有限行?如果做了限制,当超过有限行应该会报错,所有是否可以用EXCEPTION来处理呢
      

  2.   

    不是很明白,为什么第二张表是有限行?如果做了限制,当超过有限行应该会报错,所有是否可以用EXCEPTION来处理呢因为其实可以认为第二张表是有条件的,第一张表中的数据满足这个条件才会写入,打个比方,第一张表是很多的信,第二张表是不同的人,不同人接受不同的信,当所有人都收到信并在看信时,就没有必要把接下来的信一个一个判断了,因为人都已经在看信了,所以就不继续分发,结束循环,等到某个人看完信才会继续分发。不知道这个比喻好不好理解。
      

  3.   

    不是很明白,为什么第二张表是有限行?如果做了限制,当超过有限行应该会报错,所有是否可以用EXCEPTION来处理呢因为其实可以认为第二张表是有条件的,第一张表中的数据满足这个条件才会写入,打个比方,第一张表是很多的信,第二张表是不同的人,不同人接受不同的信,当所有人都收到信并在看信时,就没有必要把接下来的信一个一个判断了,因为人都已经在看信了,所以就不继续分发,结束循环,等到某个人看完信才会继续分发。不知道这个比喻好不好理解。
    那你加个标志来说明表是否已满应该就可以了呀
      

  4.   

    不是很明白,为什么第二张表是有限行?如果做了限制,当超过有限行应该会报错,所有是否可以用EXCEPTION来处理呢因为其实可以认为第二张表是有条件的,第一张表中的数据满足这个条件才会写入,打个比方,第一张表是很多的信,第二张表是不同的人,不同人接受不同的信,当所有人都收到信并在看信时,就没有必要把接下来的信一个一个判断了,因为人都已经在看信了,所以就不继续分发,结束循环,等到某个人看完信才会继续分发。不知道这个比喻好不好理解。
    那你加个标志来说明表是否已满应该就可以了呀
    能稍微说具体一点吗?因为不一定是最后一行插入数据就结束,有可能中间的行会空出来继续检索
      

  5.   


    -- 这个不用使用游标 ,一个子查询就可以了Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 
    Connected as test@MSGDESQL> 
    SQL> col id format a10;
    SQL> col name format a10;
    SQL> col rq format a10;
    SQL> create table a(id int, name varchar(10), rq int);
    Table created
    SQL> create table b(id int, name varchar(10), rq int);
    Table created
    SQL> begin
      2      insert into a values(1,'a',1);
      3      insert into a values(2,'s',1);
      4      insert into a values(3,'s',1);
      5      insert into a values(4,'a',1);
      6      insert into a values(5,'a',1);
      7      insert into a values(6,'a',2);
      8      insert into a values(7,'s',2);
      9      insert into a values(8,'dd',2);
     10  end;
     11  /
    PL/SQL procedure successfully completed
    SQL> insert into b
      2  select * from a
      3  where not exists(select * from a x where a.name =x.name and x.id < a.id);
    3 rows inserted
    SQL> select * from b order by id ;
            ID NAME               RQ
    ---------- ---------- ----------
             1 a                   1
             2 s                   1
             8 dd                  2
    SQL> drop table a purge ;
    Table dropped
    SQL> drop table b purge ;
    Table droppedSQL> 
      

  6.   

    这是求分组最小值,何必多次循环呢?
    select distinct b.name,first_value(a.id) over (partition by a.name order by a.id) from a,b where a.name=b.name;

    select distinct b.name,min(a.id) over (partition by a.name order by a.id) from a,b where a.name=b.name;
      

  7.   

    一个分析函数就搞定了 ROW_NUMER ... OVER
    要是下次遍历时,排除已看过的邮件,则可以在第一张表里加上一个阅读标记