FROM Score,Course WHERE studentNo IN( SELECT studentNo FROM Student
WHERE classNo IN( SELECT classNo FROM Class
WHERE institute=@institute )
) AND Score.courseNo=Course.courseNo GROUP BY courseName OPEN curCourse
FETCH curCourse INTO @courseName,@count,@avg WHILE(@@FETCH_STATUS=0) BEGIN
--将学院名称、课程名称、课程选课人数和课程平均分插入到临时表#myTemp中 INSERT INTO #myTemp VALUES(@institute,@courseName,@count,@avg) --获取下一个游标值,取该学院下一门课程的课程名、选课人数和平均分 FETCH curCourse INTO @courseName,@count,@avg END
CLOSE curCourse
DEALLOCATE curCourse
--获取游标curInstitute的下一个值,即取下一个学院 FETCH curInstitute INTO @institute END
CLOSE curInstitute
DEALLOCATE curInstitute
--显示临时表的内容,同时将临时表的内容返回给调用者 SELECT * FROM #myTemp Order BY institute END GO
--EXEC PROC3
--DROP PROCEDURE PROC3
--2) 使用游标作为OUTPUT参数的方法: --将游标使用成O
UTPUT参数。游标可以使用OUTPUT(输出)参数,但不能使用成输入参数。
--也就是说,游标可以作为结果返回,但却不能传输到过程中去。当游标被用作参数时, --需要限定其为OUTPUT和VARYING。VARYING关键字指出该结果集要用来支持输出参数。 --这样就提供了将结果集返回到调用过程的能力。 --例如:
CREATE PROCEDURE PROC3(@institute_cursor CURSOR VARYING OUTPUT) AS
SET @institute_cursor = CURSOR FOR
SELECT institute, courseName, COUNT(*), AVG(score) FROM Class,Student,Score,Course WHERE Class.classNo=Student.classNo AND Student.studentNo=Score.studentNo AND Score.courseNo=Course.courseNo GROUP BY institute,courseName ORDER BY institute OPEN @institute_cursor GO
--DECLARE @MyCursor CURSOR;
--EXEC PROC3 @institute_cursor = @MyCursor OUTPUT; --WHILE (@@FETCH_STATUS = 0) --BEGIN
-- FETCH NEXT FROM @MyCursor; --END;
--CLOSE @MyCursor;
--DEALLOCATE @MyCursor; --GO
--(4) 不允许使用聚集函数,统计每门课程的选课人数和平均分,按如下格式输出。 --课程名 1:xxxxxx
--学号 姓名 成绩 --xxxxxx xxxxxx xxxx --... ... ... --选课人数:xxx --平均分:xxx.xx
-------------------------------------------------- --课程名 2:xxxxxx
--学号 姓名 成绩 --xxxxxx xxxxxx xxxx --... ... ... --选课人数:xxx --平均分:xxx.xx
-------------------------------------------------- CREATE PROCEDURE PROC4 AS BEGIN
SET NOCOUNT ON
DECLARE @courseNo char(3),@courseName varchar(30) DECLARE @n tinyint=0
DECLARE curCourse CURSOR FOR
SELECT courseNo,courseName FROM Course OPEN curCourse
FETCH curCourse INTO @courseNo,@courseName WHILE(@@FETCH_STATUS=0) BEGIN
SET @n=@n+1
PRINT '课程名' + STR(@n,2) + ':' + @courseName PRINT '学号 姓名 成绩'
DECLARE @studentNo char(7),@studentName varchar(20),@score numeric(5,1) DECLARE @count tinyint=0,@sum numeric(5,1)=0,@avg numeric(5,1)=0 DECLARE curScore CURSOR FOR
SELECT Student.studentNo,studentName,score FROM Student,Score
WHERE courseNo=@courseNo
AND Student.studentNo=Score.studentNo OPEN curScore
FETCH curScore INTO @studentNo,@studentName,@score WHILE(@@FETCH_STATUS=0) BEGIN
PRINT CONVERT(char(10),@studentNo) + CONVERT(char(10),@studentName) CONVERT(char(10),@score)
SET @sum=@sum+@score SET @count=@count+1
FETCH curScore INTO @studentNo,@studentName,@score END
CLOSE curScore
DEALLOCATE curScore
IF @count!=0 SET @avg=@sum/@count
PRINT '选课人数:' + CONVERT(char(3), @count) PRINT '平均分:' + CONVERT(char(5), @avg)
PRINT '-------------------------------------------' FETCH curCourse INTO @courseNo,@courseName END
CLOSE curCourse
DEALLOCATE curCourse END GO
--EXEC PROC4
+