CREATE OR REPLACE Function TotalIncome
( name_in IN varchar2 )
RETURN varchar2
IS
total_val number(6);
cursor c1 is
select monthly_income
from employees
where name = name_in;
BEGIN
total_val := 0;
FOR employee_rec in c1
LOOP
total_val := total_val + employee_rec.monthly_income;
END LOOP;
RETURN total_val;
END;
在这个例子中,我被告知我们正在循环遍历值,但我不理解的是,如果我们循环遍历值,为什么employee_rec.monthly_income
是必要的?另外,当我在FETCH
上employee_rec
时,我似乎遇到了错误,所以我猜他们彼此不同。
答案 0 :(得分:7)
您正在循环遍历结果集中的记录。
换句话说,:
FOR employee_rec in c1
表示打开游标c1
并对其执行提取。对于找到的每一行,将行记录分配给名为employee_rec
的记录变量。
所以要引用monthly_income
,你必须自己说employee_rec.monthly_income
而不只是monthly_income
。
当我在employee_rec上执行FETCH时
employee_rec不是游标(它是一个变量),所以你不能从中获取它。在这种情况下,C1
的提取由for循环隐式处理,因此不需要显式提取。
答案 1 :(得分:3)
您不是“遍历值”,而是循环遍历光标返回的记录。在您的情况下,您的记录只包含一个字段 - monthly_income
- 但一般来说,记录可以包含许多字段,您可以在每次循环迭代中使用这些字段。