程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle游標(顯示和隱示)之使用

oracle游標(顯示和隱示)之使用

編輯: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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved