循环的PLPL SQL光标:在相同变量中添加值并输出总计



我正在尝试在接受studentID作为输入的函数中计算GPA。我的问题是,当循环通过光标集合起来时,变量lv_gpa_calc不会添加自身。我添加了 DBMS_OUTPUT.PUT_LINE,以确保它通过光标设置正确工作,并在屏幕上打印到 lv_gpa_calc的正确单个行值,但是当它在sql块中返回函数中时,它不会添加所有这些值在一起。您不能在光标循环中设置变量吗?

更新:初始化lv_gpa_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_gpa_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它将无法工作。

最新更新