oracle儲存過程--遊標
阿新 • • 發佈:2021-01-10
*遊標*
什麼是遊標
用於臨時儲存一個查詢返回結果的多行資料(結果集:類似於java的jdbc連線返回的resultset集合),通過遍歷遊標,可以逐行訪問處理該結果集的資料。
*遊標的使用方式:宣告--->開啟--->讀取--->關閉*
*語法*
*遊標宣告:*
Cursor 遊標名[(引數列表)] is 查詢語句;
遊標的開啟:open 遊標名
遊標的取值:
Fetch 遊標名 into 變數列表
遊標的關閉:
Close 遊標名;
*遊標的屬性*
*其中,%notfound是在遊標中找不到元素的時候返回true,通過那個用來判斷退出迴圈*
*不帶有引數的遊標*
*小案例:* --使用遊標查詢emp表中所有員工的姓名和工資,並將其依次打印出來。****
**-- Created on 2020/12/12 by zyq** declare **--宣告遊標** cursor c_emp is select ename, sal from emp; **--宣告變數接收遊標中的資料** v_ename emp.ename%type; v_sal emp.sal%type; begin **--開啟遊標** open c_emp; **--遍歷遊標** loop **--獲取遊標中的資料** fetch c_emp into v_ename, v_sal; **--退出迴圈條件** exit when c_emp%notfound; dbms_output.put_line(v_ename || '_' || v_sal); end loop; **--關閉遊標** close c_emp; end;
*執行結果:*
SMITH_800
ALLEN_1600
WARD_1250
JONES_2975
MARTIN_1250
BLAKE_2850
CLARK_2450
SCOTT_3000
KING_5000
TURNER_1500
ADAMS_1100
JAMES_950
FORD_3000
MILLER_1300
*帶有引數的遊標*
*小案例:*--使用遊標查詢emp表中所有員工的姓名和工資,部門編號*為執行時手動輸入。*****
**-- Created on 2020/12/12 by zyq** declare **--宣告遊標 帶有引數** cursor c_emp(v_deptno emp.deptno%type) is select ename, sal from emp where deptno = v_deptno; **--宣告變數接收遊標中的資料** v_ename emp.ename%type; v_sal emp.sal%type; begin **--開啟遊標 傳入引數** open c_emp(10); **--遍歷遊標** loop **--獲取遊標中的資料** fetch c_emp into v_ename, v_sal; **--退出迴圈條件** exit when c_emp%notfound; dbms_output.put_line(v_ename || '_' || v_sal); end loop; **--關閉遊標 不需要傳引數了** close c_emp; end;
執行結果:
CLARK_2450
KING_5000
MILLER_1300
*注意: %notfound 屬性預設值為false ,所以在迴圈中要注意判斷條件的位置,如果先判斷在fetch會導致最後一條記錄的值被列印兩次(多迴圈一次預設);*