Oracle Pl/SQL循环遍历游标的值

Oracle Pl/SQL循环遍历游标的值,oracle,plsql,Oracle,Plsql,在这个例子中,我被告知我们在循环价值观,但我不明白的是,如果我们在循环价值观,为什么需要员工每月收入?另外,当我在employee_rec上进行提取时,我似乎得到了一个错误,因此我猜它们彼此不同。您不是在循环遍历值,而是在循环遍历光标返回的记录。在您的情况下,您的记录只包含一个字段-月收入-但一般来说,一个记录可以包含多个字段,您可以在每次循环迭代中根据需要使用这些字段。您不是在值之间循环,而是在光标返回的记录之间循环。在您的情况下,您的记录只包含一个字段-月收入-但一般来说,一个记录可以包含多

在这个例子中,我被告知我们在循环价值观,但我不明白的是,如果我们在循环价值观,为什么需要员工每月收入?另外,当我在employee_rec上进行提取时,我似乎得到了一个错误,因此我猜它们彼此不同。

您不是在循环遍历值,而是在循环遍历光标返回的记录。在您的情况下,您的记录只包含一个字段-月收入-但一般来说,一个记录可以包含多个字段,您可以在每次循环迭代中根据需要使用这些字段。

您不是在值之间循环,而是在光标返回的记录之间循环。在您的情况下,您的记录只包含一个字段-月收入-但一般来说,一个记录可以包含多个字段,您可以在每次循环迭代中使用这些字段。

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

换言之:

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;
表示打开光标c1并对其执行提取。对于找到的每一行,将行记录分配给名为employee\u rec的记录变量

因此,要在其中引用月收入,你必须说员工月收入,而不仅仅是月收入本身

当我在员工记录上提取时

employee_rec不是游标,而是一个变量,因此不能从中提取。在这种情况下,for循环隐式地处理从C1获取的数据,因此不需要显式地获取数据。

您在结果集中循环记录

换言之:

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;
表示打开光标c1并对其执行提取。对于找到的每一行,将行记录分配给名为employee\u rec的记录变量

因此,要在其中引用月收入,你必须说员工月收入,而不仅仅是月收入本身

当我在员工记录上提取时


employee_rec不是游标,而是一个变量,因此不能从中提取。在这种情况下,for循环隐式地处理从C1获取数据,因此不需要显式获取数据。

为什么这么复杂?选择Callusthly_income from employees,其中name=name_在没有光标的情况下执行相同的操作,效率会更高。我只是将此作为一个玩具示例来理解光标,将参数的名称从name_in更改为name以匹配列名,并在光标中将其称为totalincome.name。您的报税表类型应为数字,且总值应为员工月收入百分比类型,或者仅为数字。考虑将游标的SQL放置在for语句中,而不是使用命名游标——如果代码审查者不必四处查看C1的含义,那么它将更容易支持。至少,给它起个像样的名字。为什么这么复杂?选择Callusthly_income from employees,其中name=name_在没有光标的情况下执行相同的操作,效率会更高。我只是将此作为一个玩具示例来理解光标,将参数的名称从name_in更改为name以匹配列名,并在光标中将其称为totalincome.name。您的报税表类型应为数字,且总值应为员工月收入百分比类型,或者仅为数字。考虑将游标的SQL放置在for语句中,而不是使用命名游标——如果代码审查者不必四处查看C1的含义,那么它将更容易支持。至少,给它起个像样的名字。