oracle游标(显示和隐示)之使用

要求:定义一个游标,使用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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值