0

PL/SQLに関しては、私は非常に「初心者」ですが、クエリだけでなく、具体的にPL/SQLコード(DECLARE/BEGIN/など)を作成する必要があります。

うまくいけば、残りの問題を把握できるようになる良い例を1つ見つけようとしています。これが私が現在理解しようとしているものです:

各学生の合計単位数を計算する PL/SQL プログラムを作成します。注: 学生が F を取得したコースは単位としてカウントされません。成績が低かったクラスを再受講した場合、単位としてカウントされるのは 1 回のみです。出力には、studentnum と合計クレジットが含まれている必要があります。

Student-schema =(studentnum, name, standing, gpa, major)
Class-schema = (schedulenum, semester, department, classnum, days, time, place, enrollment)
Instructor-schema = (name, department, office)
Teaches-schema = (name, schedulenum, semester)
Taking-schema = (studentnum, schedulenum, semester, grade)

これが私の哀れな試みの1つです:

DECLARE
    stud_id student.studentnum%TYPE;
    total number(10);
BEGIN
    FOR count IN (SELECT* FROM taking)
    LOOP
        SELECT studentnum, count(*) total
    INTO stud_id, total
    WHERE grade >= 1;
    END LOOP;
END; 
/

上記のもので、私が間違っているか正しいかを識別してください。1行目で「正確なフェッチが要求された行数を超えて返されます」というエラーが表示されます。以前にこのエラーが発生し、forループで解決すると考えていました。明らかに私は間違っていました。正しくクエリを実行したとしても、これがどのように結果を正常に出力するかさえわかりません。私はとても迷っており、少しの方向性が大いに役立ちます。

4

3 に答える 3

1

以下のコードは、学生の結果セットとその成績の数を反復処理します。「F」の成績はカウントしません。スニペットは、どのクラスも複数の成績に貢献できないという制限を実装していません。ただし、不足している部分を補完できるように、開始する必要があります。

DECLARE
    stud_id student.studentnum%TYPE;
    total number(10);
BEGIN
    FOR i IN (
        SELECT s.studentnum  stud
             , COUNT(*)      cnt
          FROM student  s
          JOIN taking   t   on ( t.studentnum   = s.studentnum  )
          JOIN class    c   on ( c.schedulenum  = t.schedulenum )
         WHERE t.grade > 0
      GROUP BY s.studentnum
    ) LOOP
        NULL; -- whatever
    END LOOP;
END; 
/
于 2013-04-23T16:40:30.787 に答える
0

私は適切な解決策を見つけたと信じています。答えはどれも実際には機能しなかったので、データを調べるためのカーソルを作成するだけになりました。私が行っている結合のために、同じ学生が受講した重複したクラスを除外すると思います:

DECLARE
    CURSOR c IS
        SELECT taking.studentnum, count(*) total
        FROM student, taking, class
        WHERE grade > 0
    AND student.studentnum = taking.studentnum
    AND taking.schedulenum = class.schedulenum
    AND taking.semester = class.semester
    GROUP BY taking.studentnum;
    credits c%ROWTYPE;
BEGIN
    OPEN c;
    LOOP
    FETCH c INTO credits;
        EXIT WHEN c%NOTFOUND;
    dbms_output.put_line('Student#: ' || credits.studentnum || 
        '  Credits: ' || credits.total);
    END LOOP;
END;
/
于 2013-04-23T19:21:46.363 に答える