我的代码有另一个问题,我认为我很了解这个。目标是根据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;
答案 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;