1、說明游標文法:CURSOR 游標名 [ (參數名 資料類型[,參數名 資料類型]...)] IS SELECT 語句;2、用於儲存一個查詢返回的多行資料3、開啟游標: open c1; (開啟游標執行查詢)4、取一行游標的值:fetch c1 into pjob; (取一行到變數中)5、關閉游標: close c1;(關閉遊標釋放資源)6、注意: 上面的pjob必須與emp表中的job列類型一致: 定義:pjob emp.job%type;例一:按職工的職稱長工資,總裁1000元,經理800元,其他人員長400元Java程式SQL> update emp set sal = (case job when 'PRESIDENT' then sal+1000when 'MANGER' then sal+800else sal+400end);PL/SQL程式declare--定義游標 查詢empno以及job崗位cursor c1 is select empno,job from emp;--聲明一個變數 此變數與emp表中的job欄位類型一致emp_job emp.job%type;--聲明一個變數 此變數與emp表中的empno欄位類型一致emp_empno emp.empno%type;--開始begin --開啟游標 open c1; --迴圈開始 loop --取出游標 fetch c1 into emp_empno,emp_job; exit when c1%notfound;--判斷游標是否存在 如果存在 則往下執行 否則 不執行 if emp_job='PRESIDENT' then update emp set sal =sal+1000 where empno=emp_empno; elsif emp_job='MANAGER' then update emp set sal =sal+800 where empno=emp_empno; else update emp set sal =sal+1000 where empno=emp_empno; end if; end loop;--退出迴圈 close c1;--關閉游標 end;--結束標識例二:找出7369的職位declare emp_job emp.job%type;begin select job into emp_job from emp where empno=7369;-----into方法,把查詢出來的job 名放到emp_job中 dbms_output.put_line(emp_job);end;找出emp中的所有職位 declare--定義游標 查詢job崗位cursor c1 is select job from emp;--聲明一個變數 此變數與emp表中的job欄位類型一致emp_job emp.job%type;--開始begin --開啟游標 open c1; --迴圈開始 loop --取出游標 fetch c1 into emp_job; exit when c1%notfound;--判斷游標是否存在 如果存在 則往下執行 否則 不執行 dbms_output.put_line(emp_job); end loop;--退出迴圈 close c1;--關閉游標 end;--結束標識例三:尋找出所有的enamedeclarecursor c1 is select * from emp;emp_row emp%rowtype;beginopen c1;loopfetch c1 into emp_row;exit when c1%notfound;dbms_output.put_line(emp_row.ename);end loop;close c1;end;例四:查詢部門號為10的員工資訊declarecursor c1 (emp_deptno number) is select * from emp where deptno=emp_deptno;emp_row emp%rowtype;beginopen c1(10);dbms_output.put_line('部門號為10的員工資訊');loop fetch c1 into emp_row; exit when c1%notfound; dbms_output.put_line('員工編號'||emp_row.empno||'員工姓名'|| emp_row.ename||'員工工資'|| emp_row.sal||'員工部門編 號'||emp_row.deptno);end loop;close c1;end;結果:部門號為10的員工資訊員工編號7782員工姓名CLARK員工工資2450員工部門編號10員工編號7839員工姓名KING員工工資5000員工部門編號10員工編號7934員工姓名MILLER員工工資1300員工部門編號10帶參數的游標例五:帶有參數游標的練習SQL> declare 2 cursor c1(emp_deptno number) is select * from emp where deptno=emp_deptno; 3 emp_row emp%rowtype; 4 begin 5 open c1(10); 6 loop 7 fetch c1 into emp_row; 8 exit when c1%notfound ; 9 dbms_output.put_line('員工的名稱'|| emp_row.ename || emp_row.job); 10 end loop; 11 close c1; 12 end; 13 / 結果:員工的名稱CLARKMANAGER員工的名稱KINGPRESIDENT員工的名稱MILLERCLERK特別注意:
在開啟遊標之前最好先判斷遊標是否已經是開啟的。
通過ISOPEN判斷,格式:
遊標%ISOPEN
IF mycur%ISOPEN
THEN
null ;
ELSE
OPENmycur ;
END IF ;