要求:定義一個游標,使用FOR循環將班級編號為20010505的學生平均分按從高到低排名,
要求在SQL*PLUS環境中顯示學號,姓名,姓名,班級名稱,平均分,名次字段。
注意:1,顯示隱標屬性%rowcount是個變化的值,即它不是這個游標的環境區域的總行數,而是一個不斷增長的值,這不同於隱示游標,是多少就是多少.如:
後碰到一個要求:創建一個存儲過程,使用游標循環找出班級編號為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;