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;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
