要求:定义一个游标,使用FOR循环将班级编号为20010505的学生平均分按从高到低排名,
要求在SQL*PLUS环境中显示学号,姓名,姓名,班级名称,平均分,名次字段。
create or replace procedure ShowAvgScoreDesc_Cursor is
begin
declare cursor 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'
group by s.studno,studname,classname
order by avg(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;


注意:1,显示隐标属性%rowcount是个变化的值,即它不是这个游标的环境区域的总行数,而是一个不断增长的值,这不同于隐示游标,是多少就是多少.如:
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;后碰到一个要求:创建一个存储过程,使用游标循环找出班级编号为20010505班的平均分最高的学生和最低的学生。(注:不能使用MAX,MIN)
create or replace procedure Pr_MaxAvgAndMinAvg is
begin
/**//*
创建一个存储过程,使用游标循环找出班级编号为20010505班的平均分最高的学生和最低的学生。(注:不能使用MAX,MIN)
*/
declare cursor 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'
group by s.studno,studname,classname
order by avg(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=1 then
dbms_output.put_line('学号'||studscore_record.studno||',姓名'||studscore_record.studname||',班级名称:'||studscore_record.classname||'平均分:'||studscore_record.avgscore);
end if;
if i=MaxCount then
dbms_output.put_line('学号'||studscore_record.studno||',姓名'||studscore_record.studname||',班级名称:'||studscore_record.classname||'平均分:'||studscore_record.avgscore);
end if;
i:=i+1;
end loop;
end;
end Pr_MaxAvgAndMinAvg;
本文介绍了如何使用SQL游标在Oracle环境下实现对学生平均成绩的排序显示,并通过具体案例展示了如何找出指定班级平均分最高和最低的学生,不使用MAX和MIN函数。
1293

被折叠的 条评论
为什么被折叠?



