是什么导致我的代码错误

时间:2015-07-02 22:41:52

标签: oracle plsql

我的代码有另一个问题,我认为我很了解这个。目标是根据movie_id的租借次数显示movie_id的评级。我是否正确使用%ROWCOUNT作为代码中IF / ELSIF子句的测试条件?因此,如果movie_id显示在10行上,则排名为High(用变量mov_flag声明)。如果我完全错了,请用简单的术语向我展示方法以便理解。谢谢!

我的代码:

DECLARE 
mov_flag    VARCHAR(3); --flag for test condition   
   SELECT movie_id, movie_title 
       FROM mm_movie JOIN mm_rental
         USING (movie_id)
           WHERE movie_id = &movie_id;
BEGIN
  IF movie_id%ROWCOUNT > 35 THEN mov_flag := 'High';
    ELSIF movie_id%ROWCOUNT >= 21 THEN mov_flag := 'Mid';
      ELSIF movie_id%ROWCOUNT >= 5 THEN mov_flag := 'Low';
         ELSE mov_flag := 'Dump';
END IF;
DBMS_OUTPUT.PUT_LINE('Movie ID: ' || movie_id || 
                     'Movie title: ' || movie_title ||
                     'Movie Rating: ' || mov_flag);
END;

1 个答案:

答案 0 :(得分:1)

ROWCOUNT告诉您从隐式或显式游标中提取了多少行。它只会告诉你一部电影在你被选中的情况下被租了多少次。您也不能在声明部分中放置查询,除非它是游标声明的一部分。您需要将每列选择为变量。

您希望将简单的聚合计数转换为数字变量:

DECLARE
  l_movie_id mm_movie.movie_id%type;
  l_movie_title mm_movie.movie_title%type;
  l_rent_count pls_integer;
  l_rating varchar2(4);
BEGIN
  SELECT mm.movie_id, mm.movie_title, count(mr.movie_id)
  INTO l_movie_id, l_movie_title, l_rent_count
  FROM mm_movie mm
  LEFT JOIN mm_rental mr
  ON mr.movie_id = mm.movie_id
  WHERE mm.movie_id = &movie_id
  GROUP BY mm.movie_id, mm.movie_title;

  IF l_rent_count > 35 THEN l_rating := 'High';
  ELSIF l_rent_count >= 21 THEN l_rating := 'Mid';
  ELSIF l_rent_count >= 5 THEN l_rating := 'Low';
  ELSE l_rating := 'Dump';
  END IF;

  DBMS_OUTPUT.PUT_LINE('Movie ID: ' || l_movie_id || 
                 ' Movie title: ' || l_movie_title ||
                 ' Movie Rating: ' || l_rating);
END;

但是你不应该依赖客户端看到的dbms_output。它对调试很有用,而不适用于一般显示。

你可以这样做,而不是使用case而不是if / else:

SELECT mm.movie_id, mm.movie_title,
  CASE WHEN count(mr.movie_id) > 35 THEN 'HIGH'
    WHEN count(mr.movie_id) >= 21 THEN 'MED'
    WHEN count(mr.movie_id) >= 5 THEN 'LOW'
    ELSE 'DUMP'
  END AS rating
FROM mm_movie mm
LEFT JOIN mm_rental mr
ON mr.movie_id = mm.movie_id
WHERE mm.movie_id = &movie_id
GROUP BY mm.movie_id, mm.movie_title;