Одна очевидная проблема с вашим кодом - это CURSOR. Курсоры переменные и поэтому должны быть определены в разделе ДЕКЛАРАЦИЯ. Затем вам нужно открыть curosr в корпусе пакета. Также вам нужно проверить, действительно ли FETCH извлекает строку.
create or replace
PROCEDURE p2(x NUMBER )
as
CURSOR c1 for
SELECT staff.bno ,
branch.street||' '||branch.suburb||' '||branch.postcode
FROM deal , staff, contact , property
where staff.peid = contact.peid
and contact.pno = property.pno
and property.pno = deal.pno
group by staff.bno
HAVING x > sum(deal.price);
staff_info staff.bno%TYPE;
address_info address%TYPE;
BEGIN
open c1;
loop
fetch c1 into staff_info,address_info ;
exit when c1%notfound;
dbms_output.put_line('BRANCH# '||' '||'ADDRESS');
dbms_output.put_line(staff_info ||' '|| address_info);
end loop;
close c1;
END;
Такие курсоры обычно не требуются. Гораздо эффективнее использовать неявный курсор.
create or replace
PROCEDURE p2(x NUMBER )
as
BEGIN
for r in ( SELECT staff.bno ,
branch.street||' '||branch.suburb||' '||branch.postcode as address_info
FROM deal , staff, contact , property
where staff.peid = contact.peid
and contact.pno = property.pno
and property.pno = deal.pno
group by staff.bno
HAVING x > sum(deal.price))
loop
dbms_output.put_line('BRANCH# '||' '||'ADDRESS');
dbms_output.put_line(r.bno ||' '|| r.address_info);
end loop;
END;