#oracle #plsql
Вопрос:
Я хочу запустить этот код на PL/SOL, чтобы показать, сколько занятий в спортивных клубах есть в моей базе данных. Вот мой код:
declare
Sporting_clubs_name sporting_clubs.name%type;
Count_of_activity number(2);
begin
for Sporting_clubs_name in
(select sporting_clubs.name,
count(club_activity.activity)
into Sporting_clubs_name, Count_of_activity
from sporting_clubs, club_activity
where sporting_clubs.club_id = club_activity.club_id
group by sporting_clubs.name)
loop
dbms_output.put_line('The '||Sporting_clubs_name||' has '||Count_of_activity||' activities.');
end loop;
end;
Когда я бегу, это показывает:
The has activities.
The has activities.
The has activities.
The has activities.
На нем должно быть указано название спортивного клуба и количество активности на выходе, но «Имя спортивного клуба» и «Количество активностей» пусты.
Я также меняю «Sporting_clubs_name» на varchar2(20), но он все еще не работает.
Что не так в моем коде, и как я могу это исправить?
Комментарии:
1. Прошло много времени с тех пор, как я делал Oracle, но ты путаешь типы.
Sporting_clubs_name sporting_clubs.name%type;
устанавливаетSporting_clubs_name
тот же тип,name
что и поле (вероятноVARCHAR2
), но затемfor Sporting_clubs_name in
используетSporting_clubs_name
как запись, а неVARCHAR2
как . У меня нет времени изучать синтаксис курсоров Oracle, но я предлагаю вам найти пример и понять его.
Ответ №1:
Вы не можете использовать select ... into
в цикле PL/SQL for .. in (select..)
.
Sporting_clubs_name
является именем переменной цикла и переменной, которой соответствует тип sporting_clubs.name%type
whowse .
Я бы подумал, что код, который вы опубликовали, даже не компилируется.
Удалите свои переменные ( Sporting_clubs_name
и Count_of_activity
), дайте count(club_activity.activity)
псевдоним (например cnt
), а затем используйте dbms_output.put_line('The '||Sporting_clubs_name.name||' has '||Sporting_clubs_name.cnt||' activities.');
вместо этого.
Ответ №2:
просто используйте неявный шаблон цикла курсора, как здесь
begin
for c in (select sporting_clubs.name,
count(club_activity.activity) as cnt
from sporting_clubs, club_activity
where sporting_clubs.club_id = club_activity.club_id
group by sporting_clubs.name )
loop
dbms_output.put_line('The '||c.name||' has '||c.cnt||' activities.');
end loop;
end;