1. 程式人生 > 實用技巧 >oracle儲存過程--遊標

oracle儲存過程--遊標

*遊標*

什麼是遊標

用於臨時儲存一個查詢返回結果的多行資料(結果集:類似於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會導致最後一條記錄的值被列印兩次(多迴圈一次預設);*