createorreplaceprocedure ShowAvgScoreDesc_Cursor is begin declarecursor studscore_cursor is /**//*序号不能放在里面,而是放在外面,后放弃使用序号,而是系统变量rownum*/ select rownum as grade,studno,studname,classname,avgscore from ( select s.studno,studname,classname,round(avg(studscore),2) avgscore from studinfo s,studscoreinfo ss,classinfo c where s.studno=ss.studno and s.classid=c.classid and s.classid='20010505' groupby s.studno,studname,classname orderbyavg(studscore) desc ); begin for studscore_record in studscore_cursor loop dbms_output.put_line('学号'||studscore_record.studno||',姓名'||studscore_record.studname||',班级名称:'||studscore_record.classname||'平均分:'||studscore_record.avgscore||',名次:'||studscore_record.grade); end loop; end; end ShowAvgScoreDesc_Cursor;
DECLARE CURSOR MyCurIS SELECT ClassID,ClassNameFROM ClassInfo; BEGIN FOR mrecIN MyCur LOOP DBMS_OUTPUT.PUT_LINE(mrec.ClassID||mrec.ClassName||'记录数:'||MyCur%Rowcount); END LOOP; END;
createorreplaceprocedure Pr_MaxAvgAndMinAvg is begin /**//* 创建一个存储过程,使用游标循环找出班级编号为20010505班的平均分最高的学生和最低的学生。(注:不能使用MAX,MIN) */ declarecursor MyCur is select s.studno,studname,classname,round(avg(studscore),2) avgscore from studinfo s,studscoreinfo ss,classinfo c where s.studno=ss.studno and s.classid=c.classid and s.classid='20010505' groupby s.studno,studname,classname orderbyavg(studscore) desc; i int; MaxCount int;/**//*而不是写在下面的语句中,也不用declare,因为前面已经有了*/ begin MaxCount:=0; i:=1; for studscore_record in MyCur loop dbms_output.put_line(''); MaxCount:=MaxCount+1; end loop; for studscore_record in MyCur loop /**//*索引从1开始,不是0*/ if i=1then dbms_output.put_line('学号'||studscore_record.studno||',姓名'||studscore_record.studname||',班级名称:'||studscore_record.classname||'平均分:'||studscore_record.avgscore); endif; if i=MaxCount then dbms_output.put_line('学号'||studscore_record.studno||',姓名'||studscore_record.studname||',班级名称:'||studscore_record.classname||'平均分:'||studscore_record.avgscore); endif; i:=i+1; end loop; end; end Pr_MaxAvgAndMinAvg;