在 pl/sql 中使用嵌套循环但未显示正确的输出

Working with nested loops in pl/sql but not displaying the proper output

SET SERVEROUTPUT ON SIZE 4000;
DECLARE 
call_id COURSE.CALL_ID%type;
sec_num COURSE_SECTION.SEC_NUM%type;
fname STUDENT.S_FIRST%TYPE ;
lname STUDENT.S_LAST%TYPE;

CURSOR c_info is 
SELECT CALL_ID , SEC_NUM 
FROM COURSE_SECTION ,COURSE,TERM
WHERE COURSE_SECTION.COURSE_ID = COURSE.COURSE_ID
AND TERM.TERM_ID = COURSE_SECTION.TERM_ID
AND TERM.TERM_DESC = 'Summer 2007' ;

CURSOR S_NAME IS 
SELECT DISTINCT S_FIRST, S_LAST    
FROM STUDENT,COURSE_SECTION,TERM,ENROLLMENT 
WHERE TERM.TERM_ID = COURSE_SECTION.TERM_ID
AND COURSE_SECTION.C_SEC_ID = ENROLLMENT.C_SEC_ID
AND COURSE_SECTION.TERM_ID=TERM.TERM_ID                             
AND ENROLLMENT.S_ID = STUDENT.S_ID
AND TERM.TERM_DESC LIKE 'Summer 2007';


   BEGIN
   OPEN c_info; 
  
   LOOP 
   FETCH c_info INTO call_id , sec_num ;
      EXIT WHEN c_info%notfound; 
      DBMS_OUTPUT.PUT_LINE('==================================');
      DBMS_OUTPUT.PUT_LINE(call_id || ' ' || 'Sec. ' || sec_num);
      DBMS_OUTPUT.PUT_LINE('==================================');   
      OPEN S_NAME;
      LOOP
        FETCH S_NAME INTO fname , lname ;
        EXIT WHEN S_NAME%notfound;
        DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname );  
      END LOOP;
       CLOSE S_NAME ;
   END LOOP; 
  
   CLOSE c_info; 
  
END; 

-- 预期的输出
-- 我有一些问题,无法显示正确的输出。我正在尝试使用嵌套循环,但在实现它时犯了一些错误。另外我认为使用显式游标要好得多。

利用诺斯伍德大学的数据库。 https://drive.google.com/file/d/1M_g7FbgOUahoFtE943OK28UxIFbUFgRk/view?usp=sharing 剧本

我在这里做了很多假设 - 我猜你正在让所有学生参加你的内部循环中的所有课程,但你真的只想让学生参加你正在处理的特定课程部分外循环。

因此您的第二个查询将需要引用正确的课程部分 ID,以将学生限制在该部分。

您不需要显式定义游标,除非您出于某种原因需要它们 - 如果您只是遍历它们,最好直接在 FOR 循环中引用它们。

所以这让我想到以下内容

set serveroutput on size 4000;
begin
   for c_info in ( 
      select call_id, 
             sec_num,
             SEC_ID       -- PK to link to enrollment later
      from   course_section,
             course,
             term
      where course_section.course_id = course.course_id
      and   term.term_id = course_section.term_id
      and   term.term_desc = 'Summer 2007' ;
   )
   loop 
      dbms_output.put_line('==================================');
      dbms_output.put_line(c_info.call_id || ' ' || 'Sec. ' || c_info.sec_num);
      dbms_output.put_line('==================================');   
      
      for s_name in (
        select distinct s_first, s_last    
        from student,
             course_section,
             term,
             enrollment 
        where term.term_id = course_section.term_id
        and   course_section.c_sec_id = enrollment.c_sec_id
        and   course_section.term_id=term.term_id                             
        and   enrollment.s_id = student.s_id
        and   term.term_desc like 'Summer 2007'
        AND   ENROLLMENT.C_SEC_ID = C_INFO.SEC_ID  -- get students just for THIS course section
      )
      loop
        dbms_output.put_line(s_name.s_first || ' ' || s_name.s_last );  
      end loop;
   end loop; 
end; 

我在 CAPS 中进行查询更改的地方。

由于我 cut/pasted 你的 SQL 在第一个查询中没有别名 - 我建议你更正这一点,因为别名列总是好的做法。

同样,我在第二个查询中保留了 DISTINCT,但我怀疑它是多余的,因为我想一个学生不会多次注册一个课程部分。 (实际上,如果你有两个不同的学生叫苏史密斯,你可能想把他们打印两次,不是吗?)