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必要なのかということです。また、FETCHオンemployee_recにするとエラーが発生するようですので、違うと思います。

4

2 に答える 2

7

結果セットのレコードをループしています。

言い換えると:

FOR employee_rec in c1

カーソルc1を開いてフェッチを実行することを意味します。見つかった行ごとに、行レコードを。というレコード変数に割り当てますemployee_rec

その中で参照するには、それだけでなくmonthly_income、言う必要があります。employee_rec.monthly_incomemonthly_income

employee_recでFETCHを実行するとき

employee_recはカーソル(その変数)ではないため、そこからフェッチしません。この場合、fromのフェッチC1はforループによって暗黙的に処理されるため、ユーザー側で明示的なフェッチは必要ありません。

于 2013-03-21T12:25:04.697 に答える
3

「値をループ」しているのではなく、カーソルによって返されたレコードをループしているのです。あなたの場合、レコードには1つのフィールドしか含まれていません---monthly_incomeしかし、一般に、レコードには多くのフィールドを含めることができ、各ループの反復に適していると思われるように使用できます。

于 2013-03-21T12:24:06.940 に答える