游標(cursor)
游標能夠根據(jù)查詢條件從數(shù)據(jù)表中提取一組記錄或粮,將其作為一個臨時表置于數(shù)據(jù)緩沖區(qū)中,利用指針逐行對記錄數(shù)據(jù)進行操作捞高。
Oracle中的游標分為顯示游標和隱式游標 氯材。
隱式游標
在執(zhí)行SQL語句時,Oracle會自動創(chuàng)建隱式游標硝岗,該游標是內(nèi)存中處理該語句的數(shù)據(jù)緩沖區(qū)氢哮,存儲了執(zhí)行SQL語句的結(jié)果。通過隱式游標屬性可獲知SQL語句的執(zhí)行狀態(tài)信息型檀。
%found:布爾型屬性冗尤,如果sql語句至少影響到一行數(shù)據(jù),值為true,否則為false裂七。
%notfound:布爾型屬性皆看,與%found相反。
%rowcount:數(shù)字型屬性背零,返回受sql影響的行數(shù)腰吟。
%isopen:布爾型屬性,當(dāng)游標已經(jīng)打開時返回true徙瓶,游標關(guān)閉時則為false毛雇。
顯式游標
用戶可以顯式定義游標。使用顯式游標處理數(shù)據(jù)要4個步驟:定義游標倍啥、打開游標禾乘、提取游標數(shù)據(jù)和關(guān)閉游標。
1.定義游標
游標由游標名稱和游標對應(yīng)的select結(jié)果集組成虽缕。定義游標應(yīng)該放在pl/sql程序塊的聲明部分始藕。
語法格式:cursor 游標名稱(參數(shù)) is 查詢語句
2.打開游標
打開游標時,游標會將符合條件的記錄送入數(shù)據(jù)緩沖區(qū)氮趋,并將指針指向第一條記錄伍派。
語法格式:open 游標名稱(參數(shù));
3.提取游標數(shù)據(jù)
將游標中的當(dāng)前行數(shù)據(jù)賦給指定的變量或記錄變量。
語法格式:fetch 游標名稱 into 變量名;
4.關(guān)閉游標
游標一旦使用完畢剩胁,就應(yīng)將其關(guān)閉诉植,釋放與游標相關(guān)聯(lián)的資源。
語法格式:close 游標名稱;
遍歷游標
第一種:loop
declare
cursor c1 is? select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
? ???? fetch c1 into v_sno,v_cno,v_grade;
? ???? exit when c1%notfound;--緊跟fetch之后
? if c1%found then
? ? ???? dbms_output.put_line(to_char(c1%rowcount)||v_cno);
? end if;
end loop;
close c1;?
end;
第二種:while
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
????fetch c1 into v_sno,v_cno,v_grade;
????while c1%found loop
? ???? dbms_output.put_line(v_sno||v_cno||v_grade);
? ? ?fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;?
end;
第三種:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
? for item in c1 loop
? ? dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
? end loop;
end;