2017-12-04 5 views
-1

PL/SQLカーソルを使用して各学生の合計クレジットと総合成績ポイントを計算し、ROUND関数を使用してGPAを計算しようとしています。私はここで間違って何をしているのか分かりません。明示的カーソルを使用して、各学生の合計クレジットと総合成績ポイントを計算します。

多くのエラーが発生しています。写真3 C

に3 B

BK 102イントロを地理ピート

BK 101イントロ:

学生名:

出力は次のようになります。 BK 140数学入門3 C

トータルクレジット:9

全体のGPA: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; 
/
+0

単純な 'SELECT'クエリで十分であるときにカーソルを使用しないでください。 –

+0

申し訳ありませんが、それはカーソルになる必要があります –

答えて

1

これはカーソル付きの別のブロックです:

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; 
+0

ありがとうございます。これは非常に役に立ちます。唯一欠けていることは、GPAはAverage Gradeによって計算されなければならないということです。出力はすべてに対して3の値を返します。 –

0

私はこのブロックをテストしていないです、しかし、私はあなたがこのようなあなたのブロックを使うべきだと思う:

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; 
+0

申し訳ありませんが、私はそれをカーソルにする必要があります –

+0

Ok。その問合せをカーソルで使用できます。しかし、あなたのコードにはいくつかのコンパイルと構文エラーがあります。 –

関連する問題