Почему мои выходные данные пусты, когда я запускаю сценарий

#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;