2013-03-21 81 views
1
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 ?另外,当我做FETCHemployee_rec我似乎得到一个错误,所以我猜他们是不同的。PL/SQL通过游标

+2

为什么这么复杂? 'select sum(monthly_income)from employees where name = name_in'在没有游标的情况下做同样的事情 - 并且会更有效率。 – 2013-03-21 12:21:52

+0

我只是用它作为了解游标的玩具示例 – Cemre 2013-03-21 12:22:42

+1

将参数名称从“name_in”更改为“name”以匹配列名称,并在游标中将其称为totalincome.name。您的返回类型应该是数字,total_val应该有一个类型的employee_rec.monthly_income%类型,或者可能只是数字。考虑将游标的SQL放在FOR语句中,而不是使用命名游标 - 如果代码审阅者不必四处查看c1的含义,将更容易支持。至少,给它一个体面的名字;)。 – 2013-03-21 13:58:44

回答

7

您正在循环结果集中的记录

换句话说

FOR employee_rec in c1 

装置打开光标c1并执行取它。对于找到的每一行,将行记录分配给一个名为employee_rec的记录变量。

所以参考monthly_income在那,你必须说employee_rec.monthly_income而不仅仅是monthly_income自己。

当我做employee_rec

employee_rec一个FETCH是不是一个光标(它是一个变量),这样你就不会从中获取。在这种情况下,从C1获取的内容由for循环隐式处理,因此不需要显式提取。

3

您不是“循环访问值”,而是循环访问游标返回的记录。在你的情况下,你的记录只包含一个字段 - monthly_income - 但通常情况下,一条记录可以包含很多字段,你可以在每次循环迭代中使用这些字段。