PLSQLCursorforLoop:将同一变量中的值相加并输出总和

PLSQLCursorforLoop:将同一变量中的值相加并输出总和,sql,plsql,Sql,Plsql,我试图在一个接受studentID作为输入的函数中计算GPA。我的问题是,当循环通过光标集工作时,变量lv\u gpa\u calc没有添加到自身中。我添加了DBMS\u输出。PUT\u LINE以确保它正确地通过光标集工作,并将lv\u gpa\u calc应为的正确行值打印到屏幕上,但当它在SQL块的函数中返回时,它不会将所有这些值相加。在游标FOR循环中不能将变量设置为自身吗 更新:初始化lv\u gpa\u calc修复了变量值未添加到自身的问题 CREATE OR REPLACE F

我试图在一个接受studentID作为输入的函数中计算GPA。我的问题是,当循环通过光标集工作时,变量
lv\u gpa\u calc
没有添加到自身中。我添加了
DBMS\u输出。PUT\u LINE
以确保它正确地通过光标集工作,并将
lv\u gpa\u calc
应为的正确行值打印到屏幕上,但当它在SQL块的函数中返回时,它不会将所有这些值相加。在游标FOR循环中不能将变量设置为自身吗

更新:初始化
lv\u gpa\u calc
修复了变量值未添加到自身的问题

CREATE OR REPLACE 
FUNCTION CALCULATE_GPA 
(p_studentID IN number)
RETURN NUMBER
IS
  CURSOR cur_gpa IS
      SELECT grade, grade_value, credit_hours
      FROM grade
      JOIN enrollment USING (Grade)
      JOIN section USING (term_code, subject_code, course_number, section)
      JOIN course USING (subject_code, course_number)
      WHERE student_ID = p_studentID;

  lv_gpa_calc NUMBER(4,2):=0;
BEGIN
  FOR rec_gpa IN cur_gpa LOOP
  lv_gpa_calc:= lv_gpa_calc + ((rec_gpa.grade_value * rec_gpa.credit_hours)/rec_gpa.credit_hours);
  DBMS_OUTPUT.PUT_LINE(lv_gpa_calc);
  END LOOP;
  RETURN lv_gpa_calc;

END CALCULATE_GPA;

代码中的问题是变量
lv\u gpa\u calc
未初始化。将任何内容添加到
NULL
将导致
NULL

简化工作测试用例:

--DROP TABLE my_numbers;

CREATE TABLE my_numbers (
  id NUMBER
);
/

BEGIN
  FOR l_i IN 1..10 LOOP
    INSERT INTO my_numbers VALUES (DBMS_RANDOM.RANDOM);
  END LOOP;
  COMMIT;
END;
/

SELECT * FROM my_numbers;
/

DECLARE
  CURSOR cur IS
    SELECT id
      FROM my_numbers;

  l_sum NUMBER(10) := 0;
BEGIN
  FOR rec IN cur LOOP    
    l_sum := l_sum + rec.id;    
    DBMS_OUTPUT.PUT_LINE('l_sum = ' || l_sum);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Sum = ' || l_sum);
END;
/
重要的一点是:

l_sum NUMBER(10) := 0;

如果没有初始化
:=0
它将无法工作。

感谢您的输入!谢谢。您知道为什么必须在开始部分之前将变量初始化为0或某个值才能使其工作吗?因为如果未初始化,则该值为NULL。然后,大多数二进制操作(具有两个操作数,如sum)将给出空值。