Хотя для этого вам не нужен PL / SQL, я полагаю, что вы выбрали этот подход для изучения.
Вы не поделились описанием таблиц, поэтому я (частично) угадаю. В любом случае, я надеюсь, что вы поймете идею.
Вместо того, чтобы явно объявлять курсор и обрабатывать все (объявить его, открыть, выбрать, позаботиться о выходе из цикла, закрыть курсор), я использую цикл курсора FOR, потому что Oracle делает большинство этой грязной работы для меня.
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;