2016-12-08 14 views
0
DECLARE 
    CURSOR cursor1 IS SELECT STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE 
    FROM STUDENTINFO 
    WHERE STUDENTNAME = '&student' 
    GROUP BY (STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE) 
    ORDER BY COURSEID; 
    S_NAME STUDENTINFO.STUDENTNAME%TYPE; 
    S_COURSEID STUDENTINFO.COURSEID%TYPE; 
    S_COURSEDESCRIPTION STUDENTINFO.COURSEDESCRIPTION%TYPE; 
    S_COURSECREDITS STUDENTINFO.COURSECREDITS%TYPE; 
    S_GRADE STUDENTINFO.GRADE%TYPE; 
    S_TOTALCREDITS STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_A STUDENTINFO.COURSECREDITS%TYPE := 4; 
    S_B STUDENTINFO.COURSECREDITS%TYPE := 3; 
    S_C STUDENTINFO.COURSECREDITS%TYPE := 2; 
    S_D STUDENTINFO.COURSECREDITS%TYPE := 1; 
    S_F STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_GPABEFOREDIV STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_CREDITSTOGPA STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_GPA NUMBER(4,2); 
BEGIN 
    OPEN CURSOR1; 
    LOOP 
    FETCH CURSOR1 INTO S_NAME, S_COURSEID, S_COURSEDESCRIPTION, S_COURSECREDITS, S_GRADE; 
    EXIT WHEN cursor1%NOTFOUND; 
     IF (S_GRADE = 'A') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_A); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'B') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_B); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'C') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_C); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'D') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_D); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSE 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_F); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE(CHR(10)); 
    DBMS_OUTPUT.PUT_LINE(S_COURSEID ||' '|| S_COURSEDESCRIPTION ||' '|| S_COURSECREDITS ||' '|| S_GRADE); 
    S_TOTALCREDITS := S_TOTALCREDITS + S_COURSECREDITS; 
    S_GPA := (S_GPABEFOREDIV/S_TOTALCREDITS); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('Total Credits: ' || S_TOTALCREDITS); 
    DBMS_OUTPUT.PUT_LINE('Overall GPA: ' || S_GPA); 
    CLOSE CURSOR1; 
END; 
/

入力を受けた後に生徒のGPAを出力するためのカーソルです。私はこれをパラメータ(学生の名前)と1つ(gpa)の1の手続きに移す必要があります。私はどこから始めようとも完全に迷っています。私は、コースごとにクレジットを加算するために、どこかでループを使用しなければならないと仮定しています。プロシージャにカーソルを移動する方法は?

+0

「カーソルを転送する」とはどういう意味ですか?上記を手続きに変換したいですか? – GurV

答えて

1

上記のコードをstudent_nameを入力とし、出力としてgpaを生成するプロシージャとして記述したいとします。ここでは:

CREATE OR REPLACE PROCEDURE GPA_PR(p_student_name in varchar2, p_gpa out number) is 
    CURSOR cursor1 IS SELECT STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE 
    FROM STUDENTINFO 
    WHERE STUDENTNAME = p_student_name 
    GROUP BY (STUDENTNAME, COURSEID, COURSEDESCRIPTION, COURSECREDITS, GRADE) 
    ORDER BY COURSEID; 
    S_NAME STUDENTINFO.STUDENTNAME%TYPE; 
    S_COURSEID STUDENTINFO.COURSEID%TYPE; 
    S_COURSEDESCRIPTION STUDENTINFO.COURSEDESCRIPTION%TYPE; 
    S_COURSECREDITS STUDENTINFO.COURSECREDITS%TYPE; 
    S_GRADE STUDENTINFO.GRADE%TYPE; 
    S_TOTALCREDITS STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_A STUDENTINFO.COURSECREDITS%TYPE := 4; 
    S_B STUDENTINFO.COURSECREDITS%TYPE := 3; 
    S_C STUDENTINFO.COURSECREDITS%TYPE := 2; 
    S_D STUDENTINFO.COURSECREDITS%TYPE := 1; 
    S_F STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_GPABEFOREDIV STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_CREDITSTOGPA STUDENTINFO.COURSECREDITS%TYPE := 0; 
    S_GPA NUMBER(4,2); 
BEGIN 
    OPEN CURSOR1; 
    LOOP 
    FETCH CURSOR1 INTO S_NAME, S_COURSEID, S_COURSEDESCRIPTION, S_COURSECREDITS, S_GRADE; 
    EXIT WHEN cursor1%NOTFOUND; 
    IF (S_GRADE = 'A') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_A); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'B') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_B); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'C') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_C); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSIF (S_GRADE = 'D') THEN 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_D); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    ELSE 
     S_CREDITSTOGPA := (S_COURSECREDITS * S_F); 
     S_GPABEFOREDIV := S_GPABEFOREDIV + S_CREDITSTOGPA; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE(CHR(10)); 
    DBMS_OUTPUT.PUT_LINE(S_COURSEID ||' '|| S_COURSEDESCRIPTION ||' '|| S_COURSECREDITS ||' '|| S_GRADE); 
    S_TOTALCREDITS := S_TOTALCREDITS + S_COURSECREDITS; 
    S_GPA := (S_GPABEFOREDIV/S_TOTALCREDITS); 
    END LOOP; 
    CLOSE CURSOR1; 
    p_gpa := S_GPA; 
END; 
/
+0

ありがとうございました!私はあなたがプロシージャにカーソルを投げることができるとは気付かなかった。私は全部を書き直す必要があると思った。 – Josh

0

プロシージャのoutパラメータでカーソルを戻すことができます。

関連する問題