oracle 游標簡單示例


  1.游標的概念以及作用

      游標(Cursor)可以使用戶想操作數組一樣對查詢出來的結果集進行操作,可以形象的看做一個變動的光標,其實際行是一個指針,它在一段Oracle存放數據查詢結果集或數據

    操作集的內存中,這個指針可以指向結果集的任何位置。

    分類: 分為靜態游標和ref游標(暫不做介紹)。靜態游標 又分為 顯示游標和隱式游標 ,隱式游標它是被oracle自動管理的 ,不需要詳細的去了解只需要 知道怎么用就可以了。

      顯示游標:就是我們普遍使用的。就是在使用之前有着明確的定義,一般都會關聯數據查詢語句,返回一行或多行記錄。

      使用步驟:1.聲明游標  2.打開游標 3.提取數據 4.關閉游標  

    語法結構:簡單語法結構如下代碼示例    

 1 DECLARE CURSOR cursor_name
 2      --1.聲明名為cursor_name 的游標
 3      IS          
 4         --與之關聯的sql語句               
 5        SELECT ID ,NAME ,score FROM TABLE ;
 6          --聲明了一個與數據表字段name類型一樣的變量myname
 7        myname tablename.name%TYPE;   
 8         --聲明了一個可以去表中一行記錄的變量
 9        myrow tablename%ROWTYPE;   
10     BEGIN         
11      --2.打開游標
12         OPEN cursor_name; 
13      --3.提取數據   
14         FETCH CURSOR INTO myrow; 
15         dbms_output.put_line(myrow.name||'---'||myrow.id);
16         
17       --4.關閉游標
18         CLOSE cursor_name;
19     END;   

       通常顯示游標提取的數據不會只有一條,所有想遍歷其結果集就需使用loop

    下邊創建一張簡單的數據表,使用loop游標操作數據

1 CREATE TABLE cur_test_student(
2        --創建簡單的測試表 id號, 名字 ,分數 ,科目,年齡
3     sid NUMBER(8) PRIMARY KEY,   
4     sname VARCHAR2(10) NOT null,   
5     score NUMBER(8) NOT null,
6     subject  Varchar2(20),
7     sage NUMBER(8)
8 );

 

   loop游標示例:

  

 1 DECLARE CURSOR cur_score
 2 --聲明游標查詢某一科目所有學生的name和score
 3 IS
 4  SELECT sname,score FROM cur_test_student WHERE subject='語文'; 
 5     namee cur_test_student.sname%TYPE;
 6     sco cur_test_student.score%TYPE;
 7     
 8  BEGIN
 9    OPEN cur_score; 
10      LOOP    
11      --提取數據保存到兩個變量中
12        FETCH cur_score INTO namee,sco; 
13        --隱式游標判斷當沒有數據是退出循環 
14        EXIT WHEN cur_score%NOTFOUND;
15        dbms_output.put_line(namee||'----------'||sco);
16        
17      END LOOP;
18    CLOSE cur_score;
19  END;

 

      

   for循環游標:

  游標for循環是在pl/sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for循環時,oracle會隱含的打開游標,提取游標數據並關閉游標。

  

 1 DECLARE CURSOR cur_score
 2 --聲明游標查詢某一科目所有學生的name和score
 3 IS
 4  SELECT sname,score FROM cur_test_student WHERE subject='語文'; 
 5    BEGIN
 6  FOR student_recode IN cur_score LOOP
 7  
 8  dbms_output.put_line(student_recode.sname||'---'||student_recode.score);
 9  
10   END LOOP;
11  END;

    注意兩種寫發的不同之處:在for循環的游標中沒有 打開游標 關閉游標等四部操作,很多工作oracle隱式的幫我們執行了 也不需要判斷合適退出等工作。

  這種寫法比簡單明了。

帶參數的游標

  使用游標是可以指定參數,可以傳入多個參數 方便多條件查詢,在存儲過程中也可以方便的使用

  

 1 DECLARE CURSOR cur_score(sub VARCHAR2) IS
 2 
 3     SELECT sname ,score FROM cur_test_student WHERE subject=sub;
 4     
 5     BEGIN
 6        FOR score_recode IN cur_score('語文')LOOP
 7           
 8         dbms_output.put_line(score_recode.sname||'---'||score_recode.score);
 9     
10      END LOOP;
11     END;

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  

 

 

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM