2017-07-21 32 views
0

ここでの目標は、ループ内でネストされたカーソルを実行して、セクション名と番号、そのセクション内のすべての人物を表示することです。SQLエラー - カーソルが不正または不完全です

最初にコード。ここで

SET SERVEROUTPUT ON SIZE 4000 

DECLARE 
    search VARCHAR2(20) := 'Summer 2007'; 
    CURSOR cur_class IS 
    SELECT call_id, sec_num, c_sec_id 
    FROM course_section 
    INNER JOIN course ON course_section.course_id = course.course_id 
    INNER JOIN term ON course_section.term_id = term.term_id 
    WHERE term.term_desc = search 
    ORDER BY course.call_id; 
    f_cur cur_class%ROWTYPE; 
    CURSOR cur_students IS 
    SELECT c_sec_id, s_first, s_last 
    FROM enrollment 
    INNER JOIN student ON enrollment.s_id = student.s_id 
    INNER JOIN course_section ON enrollment.c_sec_id = course_section.c_sec_id 
    WHERE enrollment.c_sec_id IS NOT NULL; 
    f_cur_stu cur_students%ROWTYPE; 

BEGIN 
    OPEN cur_class; 
    LOOP 
    FETCH cur_class INTO f_cur; 
    EXIT WHEN cur_class%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(f_cur.call_id || ' Sec. ' || f_cur.sec_num); 
     FOR f_cur_stu IN cur_students LOOP 
     IF f_cur.c_sec_id = f_cur_stu.c_sec_id THEN 
      DBMS_OUTPUT.PUT_LINE(f_cur_stu.s_first || ' ' || f_cur_stu.s_last); 
     END IF; 
     END LOOP; 
    END LOOP; 
    CLOSE cur_class; 
END; 

エラーメッセージです:

Error report: 
ORA-06550: line 16, column 11: 
PL/SQL: ORA-00918: column ambiguously defined 
ORA-06550: line 12, column 5: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 11, column 10: 
PLS-00341: declaration of cursor 'CUR_STUDENTS' is incomplete or malformed 
ORA-06550: line 17, column 13: 
PL/SQL: Item ignored 
ORA-06550: line 26, column 29: 
PLS-00364: loop index variable 'F_CUR_STU' use is invalid 
ORA-06550: line 26, column 9: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

私は全体の2番目のカーソルの作成とネストされたループをコメントアウトした場合、最初のループは、必要に応じて私のためにセクション名と番号を一覧表示、動作します。

問題は、2番目のカーソルcur_studentsを試したときに発生します。私はどのようにカーソルが不正な/不完全で、私はそれを完了するために何ができるのか分からない。私は他のWHERE句を試しましたが、それは常に同じことです。

EDIT:テーブル構造の画像: Table Structure

答えて

0

あなたのテーブルenrollmentc_sec_idという名前の列を持っていないかのように通常の容疑者です。

テーブル構造を共有することはできますか?

+0

ありがとう、コメントありがとうございました!私はテーブル構造をアップロードしましたが、それは以下のように答えたfg78ncでした。しかし、なぜ私はc_sec_idが登録テーブルに存在しなかったかもしれないと示唆したのか分かります。ご協力いただきありがとうございます。 – GrossMisconduct

0

1)SELECT c_sec_id, s_first, s_last

c_sec_idenrollmentcourse_sectionテーブルの両方に存在します。テーブル名の前に接頭語(enrollment.c_sec_idまたはcourse_section.c_sec_id)を付ける必要があります。それ以外の場合は、上に挙げたテーブルのうちどれから取り出したいかはコンパイラには分かりません。 FOR f_cur_stu IN cur_students LOOPf_cur_stuは、暗黙的にカーソルループ自身で変数を作成しているため

2) f_cur_stu cur_students%ROWTYPE;

あなたは、この宣言は必要ありません。

+0

感謝します!それがすべてです!私は、SELECT文でcourse_section.c_sec_idを指定する必要があることを知らなかった。私がそれについて考えると大声でそれを言うと、意味があります。ありがとうございました! "course_section"を追加するとc_sec_idの前面には、エラーはなく、完全に機能しました。 – GrossMisconduct

+0

あなたは大歓迎です! – fg78nc

関連する問題