PLSQLCursorforLoop:将同一变量中的值相加并输出总和
我试图在一个接受studentID作为输入的函数中计算GPA。我的问题是,当循环通过光标集工作时,变量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
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)将给出空值。