PL SQL Курсор для петли - PullRequest
       84

PL SQL Курсор для петли

1 голос
/ 13 апреля 2020

Я пытаюсь выполнить анализ тренда в PL SQL, используя для l oop вложенный внутри курсора для l oop. Цель состоит в том, чтобы вернуть актера между годами (2000–2013), которые снимались как минимум в 8 фильмах в течение пятилетнего периода.

Например, желаемым результатом будет: Уолберг, Марк сыграл в 10 фильмы между 2009 и 2013 годами. Вот ошибка, которую я получаю: enter image description here

Вот код, с которым я работаю до сих пор:

DECLARE
    t movie.yr%TYPE;
    actor_id actor.id%TYPE;
    total INTEGER;
    name actor.name%TYPE;
CURSOR c_actor IS
    select *
    from (select actor.name AS name, count(movie.title) AS total
        from actor, movie, casting
        where movie.id = casting.movie_id
        and actor.id = casting.actor_id
        and movie.yr >= 2000 and movie.yr <=2013
        group by actor.name
        order by count(movie.title) DESC)
    where rownum <= 10;
BEGIN
for v_actor in c_actor
LOOP
    for t in 2000 .. 2009
    LOOP
    select name, total
    into name, total
    from actor, movie
    where movie.yr between t and t+4
    and actor_id = v_actor.actor_id
    and total >= 8
    group by name;
       dbms_output.put_line(name||' played in '||total||' movies between '||t||' and '||t+4);
   END LOOP;
END LOOP;
END;

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Кажется, ты это слишком усложнил. Это должно работать:

begin
  for v_actor in (select a.name, count(*) total
                  from actor a join casting c on a.id = c.actor_id
                  join movie m on m.id = c.movie_id
                  where m.yr between 2000 and 2013
                  group by a.name
                  having count(*) >= 8
                 )
  loop
    dbms_output.put_line(v_actor.name ||' acted ' || v_actor.total ||' times');
  end loop;
end;

Я думаю, что вы создали вопрос за пару часов до (и удалили его), делая те же ошибки. Например: вы создали переменную с именем total и в то же время поместили ее в оператор select курсора. Вы хотите отобразить значение, извлеченное курсором, а не самой переменной, если только курсор не извлекается в эту переменную - но это делается, когда вы явно открываете / извлекаете из курсора, а не внутри курсора FOR l oop. С его помощью вы используете переменную курсора и используете ее для отображения этих значений.

1 голос
/ 14 апреля 2020

вы не получаете actor_id в запросе вашего курсора.

select *
    from 
   (
    select a.name AS name, count(m.title) AS total
      from actor a
      join casting c 
        on a.id = c.actor_id
      join movie m 
        on m.id = c.movie_id
     where m.yr >= 2000 
       and m.yr <=2013
     group by actor.name
     order by count(movie.title) desc 
   )
   where rownum <= 10;
...