Sql 使用显式光标计算每个学生的总学分和总分数

Sql 使用显式光标计算每个学生的总学分和总分数,sql,oracle,plsql,Sql,Oracle,Plsql,我试图使用PL/SQL游标计算每个学生的总学分和总分数,并使用ROUND函数计算GPA。我不知道我在这里做错了什么 我犯了很多错误 输出应如下所示: 学生姓名:Pete BK 101地理入门3B BK 102照片介绍3c BK 140数学数学3 C简介 总学分:9 总平均成绩:2.33 DECLARE CURSOR studentCursor IS SELECT StudentName, CourseID, CourseDescription, CourseCredits, Grade FRO

我试图使用PL/SQL游标计算每个学生的总学分和总分数,并使用ROUND函数计算GPA。我不知道我在这里做错了什么

我犯了很多错误

输出应如下所示:

学生姓名:Pete

BK 101地理入门3B

BK 102照片介绍3c

BK 140数学数学3 C简介

总学分:9

总平均成绩:2.33

DECLARE
CURSOR studentCursor IS SELECT StudentName, CourseID, CourseDescription, 
CourseCredits, Grade
FROM SampleStudent;
s_StudentName VarChar2 (30)
s_CourseID Varchar2 (20)
s_CourseDescription VarChar2 (30)
s_CourseCredits VarChar2 (2)
s_Grade VarChar (2)
s_GradePoint
BEGIN
OPEN studentcursor;
    LOOP
      FETCH studentcursor INTO s_StudentName, s_CourseID, 
s_CourseDescription, s_CourseCredits, s_Grade;
      EXIT WHEN studentcursor%NOTFOUND; 
IF s_Grade = 'A' THEN s_GradePoint := 4
IF s_Grade = 'B' THEN s_GradePoint := 3
IF s_Grade = 'C' THEN s_GradePoint := 2
END IF;
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE('Student Name: ' || s_StudentName);
DBMS_OUTPUT.PUT_LINE(s_CourseDescription || s_CourseCredits || s_Grade);
DBMS_OUTPUT.PUT_LINE('Total Credits:' || SUM(s_CourseCredits);
DBMS_OUTPUT.PUT_LINE('Overall GPA:' || ROUND()
END LOOP;
CLOSE studentCursor;
DBMS_OUTPUT.PUT_LINE('GRAND TOTAL VALUE OF ALL ITEMS:');
END;
/

我不是在测试这个块,但我认为你应该像这样使用你的块:

DECLARE 
  V_TOTAL_CREDITS NUMBER := 0;
BEGIN
  FOR RC IN (
            SELECT StudentName, 
                   CourseID, 
                   CourseDescription, 
                   Grade,
                   DECODE(GRADE, 'A', 4, 'B', 3, 'C', 2) GRADE_POINT, 
                   CourseCredits,
                   SUM(CourseCredits) OVER(PARTITION BY StudentName ORDER BY CourseID)  SUM_COURSE_CREDITS,
                   AVG(CourseCredits) OVER(PARTITION BY StudentName ORDER BY CourseID)  GPA
            FROM SampleStudent
            )
  LOOP 
    V_TOTAL_CREDITS := V_TOTAL_CREDITS + RC.CourseCredits;

    DBMS_OUTPUT.PUT_LINE('Student Name: ' || RC.StudentName);
    DBMS_OUTPUT.PUT_LINE(RC.CourseID || ' '  || 
                         RC.CourseCredits || ' INTRO TO ' || 
                         RC.CourseDescription || ' ' || 
                         GRADE_POINT || ' ' || 
                         s_Grade);
    DBMS_OUTPUT.PUT_LINE('Total Credits:' || RC.SUM_COURSE_CREDITS);
    DBMS_OUTPUT.PUT_LINE('Overall GPA:' || RC.GPA);

  END LOOP;

  DBMS_OUTPUT.PUT_LINE('GRAND TOTAL VALUE OF ALL ITEMS:' || V_TOTAL_CREDITS);

END;

这是另一个带有光标的块:

DECLARE 
  V_TOTAL_CREDITS      NUMBER := 0;
  V_STUDENT_NAME       VARCHAR2(100);
  V_COURSE_ID          VARCHAR2(50);
  V_COURSE_DESCRIPTION VARCHAR2(200);
  V_GRADE              VARCHAR2(10);
  V_GRADE_POINT        PLS_INTEGER;
  V_COURSE_CREDITS     NUMBER;
  V_SUM_COURSE_CREDITS NUMBER;
  V_GPA                NUMBER;

  CURSOR STUDENT_CURSOR IS
    SELECT StudentName, 
           CourseID, 
           CourseDescription, 
           Grade,
           DECODE(GRADE, 'A', 4, 'B', 3, 'C', 2) GRADE_POINT, 
           CourseCredits,
           SUM(CourseCredits) OVER(PARTITION BY StudentName ORDER BY CourseID)  SUM_COURSE_CREDITS,
           AVG(CourseCredits) OVER(PARTITION BY StudentName ORDER BY CourseID)  GPA
    FROM SampleStudent;

BEGIN
  OPEN STUDENT_CURSOR;

  LOOP 
    FETCH STUDENT_CURSOR INTO V_STUDENT_NAME, 
                              V_COURSE_ID, 
                              V_COURSE_DESCRIPTION, 
                              V_GRADE,
                              V_GRADE_POINT,
                              V_COURSE_CREDITS,
                              V_SUM_COURSE_CREDITS,
                              V_GPA;

    EXIT WHEN STUDENT_CURSOR%NOTFOUND;

    V_TOTAL_CREDITS := V_TOTAL_CREDITS + V_COURSE_CREDITS;

    DBMS_OUTPUT.PUT_LINE('Student Name: ' || V_STUDENT_NAME);
    DBMS_OUTPUT.PUT_LINE(V_COURSE_ID || ' '  || 
                         V_COURSE_CREDITS || ' INTRO TO ' || 
                         V_COURSE_DESCRIPTION || ' ' || 
                         V_GRADE_POINT || ' ' || 
                         V_GRADE);
    DBMS_OUTPUT.PUT_LINE('Total Credits:' || V_SUM_COURSE_CREDITS);
    DBMS_OUTPUT.PUT_LINE('Overall GPA:' || V_GPA);

  END LOOP;
  CLOSE STUDENT_CURSOR;

  DBMS_OUTPUT.PUT_LINE('GRAND TOTAL VALUE OF ALL ITEMS:' || V_TOTAL_CREDITS);

END;

当一个简单的
SELECT
查询足够时,不要使用游标。很抱歉,这是一个赋值,必须是游标。对不起,我需要它是游标。您可以在游标中使用该查询。但是请注意,您的代码有一些编译和语法错误。谢谢。这很有帮助。唯一缺少的是GPA必须按平均分数计算。输出返回的值全部为3。