“它只是不允许我在光标周围放置if语句。不会执行”
满足要求的最简单方法是:
while c_baby%FOUND loop
if v_n = 0
or c_baby.rank < v_n
then
DBMS_OUTPUT.PUT_LINE(RPAD(v_baby_sex, 10) || RPAD(v_baby_rank,10) || RPAD(v_baby_name,30) || v_baby_numoc);
end if;
FETCH c_baby
如果性能是一个问题-不是你的家庭作业,但它在现实生活中很重要-那么你可能希望选择一个过滤的结果集,而不是选择所有内容并丢弃不需要的行。在这种情况下,您将使用游标变量:
.....
c_baby sys_refcursor;
BEGIN
if v_n < 0 Then
DBMS_OUTPUT.PUT_LINE('Invalid Number');
Elsif v_n > 0 Then
OPEN c_baby for
SELECT rank, CASE sex WHEN 'M' THEN 'Male' ELSE 'Female' END, GIVEN_NAME, NUMBER_OF_OCCURRENCES
FROM TBL_BABY_NAME
where rank < v_n
ORDER BY sex,rank;
Else
OPEN c_baby for
SELECT rank, CASE sex WHEN 'M' THEN 'Male' ELSE 'Female' END, GIVEN_NAME, NUMBER_OF_OCCURRENCES
FROM TBL_BABY_NAME
ORDER BY sex,rank;
end if;
FETCH c_baby
INTO .... -- the rest of your posted code