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

来源:互联网 发布:js解析url获取参数 编辑:程序博客网 时间:2024/05/18 03:43

要求:定义一个游标,使用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;
原创粉丝点击