光标获取每个人拥有的汽车数量

时间:2018-11-03 15:33:20

标签: oracle plsql

我是Oracle和DBMS的新手,我有两个表CAR_OWNER和CAR。我正在尝试使用Cursor和loop来获取每个人拥有的汽车数量,但是我应该通过Join进行吗?还是有特定功能可以做到这一点? 下面是我的代码:

declare 
    v_PNR CAR_OWNER.PNR%TYPE;
    i  NUMBER;

    cursor c_custcell is
        select First_name, Last_Name, PNR from CAR_OWNER;
begin
    i:=1;

    if not (c_custcell%isopen) then
        open c_custcell;
    end if;

    loop
        i := i +1;
        exit when i = 11; 

        fetch c_custcell into v_First_name, v_Last_name, v_PNR;
        exit when c_custcell%notfound;

        dbms_output.put_line(''||initcap (v_First_name)||',  '||initcap (v_Last_name)||',   '||v_PNR||',   '||i||','); 

    end loop;
end;
/

3 个答案:

答案 0 :(得分:0)

按所有者和count分组会更容易:

SELECT   INITCAP(first_name), INITCAP(last_name), COUNT(*)
FROM     car_owners
GROUP BY first_name, last_name

答案 1 :(得分:0)

尽管您实际上并不需要PL / SQL,但是我想您出于研究目的选择了这种方法。

您没有共享表的描述,所以我会(部分)猜测。无论如何,我希望你能明白。

我不是在使用游标FOR循环,而是使用游标FOR循环来代替显式声明游标并处理所有内容(声明它,打开,获取,小心退出循环,关闭游标),对我来说,大部分肮脏工作。

begin
  -- Select all owners. I presume that there must be some kind of the "ID"
  -- column which is used to enforce referential integrity constraint between
  -- cars and their owners. I'll use that "ID" column later, while selecting
  -- number of cars per each person
  for cur_r in (select o.first_name, o.last_name, o.owner_id
                from car_owner o
               )
  loop
    -- count number of cars for that OWNER_ID
    select count(*)
      into l_cnt
      from car c
      where c.owner_id = cur_r.owner_id;

    dbms_output.put_line(cur_r.first_name||' '||cur_r.last_name ||
         ' owns ' || l_cnt || ' cars');
  end loop;
end;

答案 2 :(得分:0)

我不认为您应该为此使用光标,也不认为您需要一个。这样的事情应该可以解决问题-但请注意,我对您的表做了一些假设,因此您需要调整查询以满足您的需求:

SELECT co.First_name, co.Last_name, COUNT(c.ID) as Number_of_cars 
FROM CAR_OWNER co 
JOIN CAR c ON co.ID = c.OWNER_ID 
GROUP BY co.First_name, co.Last_name

这将使您拥有至少一辆汽车的所有所有者;如果您想让所有车主拥有0辆车,那么请将JOIN更改为LEFT JOIN。