我正在尝试在接受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
它将无法工作。