關於遊標,首先要知道遊標的定義。sql
遊標,是內存中的一款區域,用來存放select的結果集數據庫
遊標用來處理從數據庫中檢索的多行記錄(使用select語句)。利用遊標,程序能夠逐個的處理和遍歷一次索引返回的整個記錄集。oop
在數據庫中,存在兩種遊標:fetch
1、顯示遊標(須要明肯定義)spa
顯示遊標被用於處理返回多行數據的select語句,遊標名經過CURSOR...IS語句顯示的賦給select語句。索引
在PL/SQL中處理顯示遊標的四個步驟:內存
1)聲明遊標:CURSOR IS select語句it
2)爲查詢打開遊標: OPEN 遊標名稱for循環
3) 取得結果放入PL/SQL變量中:效率
FETCH 遊標名稱 INTO list_of_variables;
FETCH 遊標名稱 INTO PL/SQL_record;
4)關閉遊標:CLOSE 遊標名稱
注意:在聲明遊標時, select語句不能包含INTO子句。當使用顯示遊標時,INTO子句是FETCH語句的一部分。
2、隱式遊標
全部的隱式遊標都被假設爲只返回一條記錄。
使用隱式遊標時,用戶無需進行聲明、打開及關閉。PL/SQL隱含地打開、處理,而後關掉遊標。
例如:
…….
SELECT studentNo,studentName
INTO curStudentNo,curStudentName
FROM StudentRecord
WHERE name=’gg’;
上述遊標自動打開,並把相關值賦給對應變量,而後關閉。執行完後,PL/SQL變量curStudentNo,curStudentName中已經有了值。
二、 隱式遊標
單條sql語句所產生的結果集合
用關鍵字SQL表示隱式遊標
4個屬性 %rowcount 影響的記錄的行數 整數
%found 影響到了記錄 true
%notfound 沒有影響到記錄 true
%isopen 是否打開 布爾值 永遠是false
多條sql語句 隱式遊標SQL永遠指的是最後一條sql語句的結果
主要使用在update 和 delete語句上
實際操做和例子:
(1)FOR循環遊標 (經常使用的一種遊標)
--<1>定義遊標
--<2>定義遊標變量
--<3>使用for循環來使用這個遊標
--前向遊標 只能往一個方向走
--效率很高
declare
--類型定義
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定義一個遊標變量
ccrec cc%rowtype;
begin
--for循環
for ccrec in cc loop
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
end;
(2) fetch遊標
--使用的時候 必需要明確的打開和關閉
declare
--類型定義
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定義一個遊標變量
ccrec cc%rowtype;
begin
--打開遊標
open cc;
--loop循環
loop
--提取一行數據到ccrec中
fetch cc into ccrec;
--判斷是否提取到值,沒取到值就退出
--取到值cc%notfound 是false
--取不到值cc%notfound 是true
exit when cc%notfound;
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
--關閉遊標
close cc;
end;
遊標的屬性4種
%notfound fetch是否提到數據 沒有true 提到false
%found fetch是否提到數據 有true 沒提到false
%rowcount 已經取出的記錄的條數
%isopen 布爾值 遊標是否打開
(3)參數遊標
按部門編號的順序輸出部門經理的名字
declare
--部門
cursor c1 is select deptno from dept;
--參數遊標c2,定義參數的時候
--只能指定類型,不能指定長度
--參數只能出如今select語句=號的右側
cursor c2(no number,pjob varchar2) is select emp.* from emp
where deptno = no and job=pjob;
c1rec c1%rowtype;
c2rec c2%rowtype;
--定義變量的時候要指定長度
v_job varchar2(20);
begin
--部門
for c1rec in c1 loop
--參數在遊標中使用
for c2rec in c2(c1rec.deptno,'MANAGER') loop
dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
end loop;
end loop;
end;
(4)引用遊標/動態遊標
-- select語句是動態的
declare
--定義一個類型(ref cursor)弱類型
type cur is ref cursor;
--強類型(返回的結果集有要求)
type cur1 is ref cursor return emp%rowtype;
--定義一個ref cursor類型的變量
cura cur;
c1rec emp%rowtype;
c2rec dept%rowtype;
begin
DBMS_output.put_line('輸出員工') ;
open cura for select * from emp;
loop
fetch cura into c1rec;
exit when cura%notfound;
DBMS_output.put_line(c1rec.ename) ;
end loop ;
DBMS_output.put_line('輸出部門') ;
open cura for select * from dept;
loop
fetch cura into c2rec;
exit when cura%notfound;
DBMS_output.put_line(c2rec.dname) ;
end loop; close cura; end;