Подумайте, как бы вы сделали это сами.У вас есть список кодов стилей и идентификаторов артиста.Вам нужно пройти по списку и посчитать, сколько раз появляется один и тот же идентификатор артиста.Вы должны сделать это для каждого отдельного идентификатора артиста в списке.Это означало бы просмотреть список несколько раз.Что если бы вы могли отсортировать список по идентификатору артиста?Тогда вам нужно будет пройти список всего один раз, потому что все строки с одинаковым идентификатором конферансье появляются вместе.Следовательно, ваш курсор должен быть ...
cursor ATA_REC is
select ENTERTAINER_ID
from ATA_ENTERTAINERS_STYLE
order by ENTERTAINER_ID
for update;
Итак, вы начинаете проходить по строкам в вашем списке.Пока идентификатор артиста текущей строки совпадает с идентификатором предыдущей строки, вы увеличиваете количество.Когда появляется новый идентификатор артиста, вы начинаете новый счет, верно?Кроме того, при изменении идентификатора артиста у вас будет количество стилей для последнего идентификатора артиста.Если это число больше одного (1), вам необходимо обновить таблицу ATA_ENTERTAINER
.
Вот мое решение.Обратите внимание, что он компилируется (в Oracle 11g Express Edition), но я не проверял его на примере данных (слишком лениво: -)
declare
ATA_ENT_ID ATA_ENTERTAINER.ENTERTAINER_ID%type;
L_ENTERTAINER_ID ATA_ENTERTAINER.ENTERTAINER_ID%type;
L_FIRST boolean;
L_SUM number(3); -- Assume less than one thousand styles for single entertainer.
--
cursor ATA_REC is
select ENTERTAINER_ID
from ATA_ENTERTAINERS_STYLE
order by ENTERTAINER_ID
for update;
begin
L_ENTERTAINER_ID := -1;
L_FIRST := true;
L_SUM := 0;
open ATA_REC;
loop
fetch ATA_REC into ATA_ENT_ID;
exit when ATA_REC%notfound;
if ATA_ENT_ID = L_ENTERTAINER_ID then
L_SUM := L_SUM + 1;
else
if L_FIRST then
L_FIRST := false;
L_SUM := 1;
L_ENTERTAINER_ID := ATA_ENT_ID;
else
if L_SUM > 1 then
update ATA_ENTERTAINER
set MORE_THAN_ONE = L_SUM
where current of ATA_REC;
end if;
end if;
L_SUM := 0;
L_ENTERTAINER_ID := ATA_ENT_ID;
end if;
end loop;
--
-- Make sure we update the last entertainer.
if L_SUM > 1 then
update ATA_ENTERTAINER
set MORE_THAN_ONE = L_SUM
where current of ATA_REC;
end if;
end;