2017-07-21 5 views
0

Mon but ici est d'avoir un curseur imbriqué s'exécutant dans les boucles, de sorte qu'il affiche un nom et un numéro de section, puis toutes les personnes dans cette section.Erreur SQL - Curseur mal formé ou incomplet

D'abord, le code.

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; 

Voici le message d'erreur:

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: 

Si je commente sur toute la seconde création du curseur et la boucle imbriquée, les premiers travaux de la boucle, la liste pour moi le nom de la section et le numéro comme vous le souhaitez.

Le problème se produit lorsque j'essaie le deuxième curseur, cur_students. Je ne sais pas comment le curseur est mal formé/incomplet et ce que je peux faire pour le compléter. J'ai essayé d'autres clauses WHERE et c'est toujours la même chose.

EDIT: Une image de la structure de la table: Table Structure

Répondre

0

Le suspect habituel est comme si votre table enrollment ne dispose pas d'une colonne nommée c_sec_id.

Pouvez-vous également partager la structure de la table?

+0

Salut, merci pour le commentaire! J'ai téléchargé la structure de la table, mais c'était comme fg78nc répondu ci-dessous. Mais je peux voir pourquoi vous avez suggéré que c_sec_id n'existait pas dans la table d'inscription. Merci pour votre aide et votre temps. – GrossMisconduct

0

1) SELECT c_sec_id, s_first, s_last

Colonne c_sec_id est présent dans les deux tables enrollment et course_section. Vous devez le préfixer avec le nom de la table, c'est-à-dire enrollment.c_sec_id ou course_section.c_sec_id, sinon le compilateur ne sait pas à partir de laquelle des tables mentionnées ci-dessus vous voulez le récupérer.

2) f_cur_stu cur_students%ROWTYPE;

Vous n'avez pas besoin de cette déclaration, parce que f_cur_stu dans FOR f_cur_stu IN cur_students LOOP est variable créée implicitement par la boucle du curseur lui-même.

+0

MERCI! C'est tout ce que c'était! Je n'ai pas réalisé que j'avais besoin de spécifier course_section.c_sec_id dans l'instruction SELECT. Je veux dire, c'est logique quand j'y pense et que je le dis à haute voix. Merci encore! Une fois j'ai ajouté "course_section". à l'avant de c_sec_id cela a fonctionné parfaitement, pas d'erreurs. – GrossMisconduct

+0

Vous êtes les bienvenus! – fg78nc