本帖最后由 wendysindy 于 2011-05-26 01:15:36 编辑

解决方案 »

  1.   


    declare
           cursor cur_1 is
           select  passengerID,Familyname||' '||Givenname Name,
                   StreetNumber||' '||StreetName||' '||StreetType Address,
                   StateName||' '||PostCode PostCode,freqflier
           from passenger-- natural join flight这个链接基本多余
           order by Familyname,PostCode;
           --如果两个表自然连接:
           --select a.col_1,b.col_2
           --from a natural join b
           --on a.id=b.id
    begin
         --for循环,自动打开和关闭游标
         for e in cur_i loop
             dbms_output.put_line('ID:'||e.passengerID||
                                  ' Name: '||e.Name||
                                  ' Address: '||e.address||
                                  ' PostCode :'||e.postcode||
                                  ' FrequentFlier: '||e.freqflier);
         end loop;
    end;
    /*
    自然连接其实就是先将两个表做笛卡尔积,然后再去除重复的行,最后得到结果(不包含重复的行);
    */
      

  2.   

    游标循环本身本有问题,你的SQL语句有问题
        SELECT passengerID,
               Familyname || ' ' || Givenname NAME,
               StreetNumber || ' ' || StreetName || ' ' || StreetType Address,
               StateName || ' ' || PostCode PostCode,
               freqflier
          FROM passenger NATURAL
          JOIN flight
         ORDER BY Familyname, PostCode;
    如果两表有相同名称的列,natural join 自动按照相名称的列进行自然等连接,
    如果没有相同名称的列,则连接就是笛卡尔积,自然连接后面人工指定on连接条件。
    所以列名不同的连接,最好使用下面这种方式
    select * from a,b where a.aid=b.bid;
      

  3.   

    游标没有问题。问题在于你的sql语句 。表连接的时间出现了笛卡尔积。你直接运行sql语句就能发现问题了。
      

  4.   

    -- 你先看下面这个查询语句返回多少条记录,再来说话,好不好? 
    select  passengerID,
                 Familyname||' '||Givenname Name,StreetNumber||' '||StreetName||' '||
                 StreetType Address,
                 StateName||' '||PostCode PostCode,freqflier
     from passenger natural join flight
    order by Familyname,PostCode;-- 不要想当然:是游标的问题!-- 你的 from passenger natural join flight ,两个表联结,一个联结条件也没有,就相当于两个表做全联结!
    -- 此时:返回的记录应该是: passenger表的所有记录行*flight表的所有记录行