Oracle游標(biāo)的關(guān)鍵子CURSOR
,用來(lái)定義查詢出來(lái)的數(shù)據(jù)集驾孔,把內(nèi)存中的數(shù)據(jù)通過(guò)游標(biāo)一條一條的循環(huán)取出。
游標(biāo)種類(lèi)
-
顯示游標(biāo)
游標(biāo)使用之前必須先聲明炸庞,一般對(duì)查詢語(yǔ)句結(jié)果定義游標(biāo)钱床,然后通過(guò)打開(kāi)游標(biāo)循環(huán)取出結(jié)果集。 -
隱式游標(biāo)
指PL/SQL管理埠居,開(kāi)發(fā)者不能自己控制查牌,只能獲得它的屬性。
顯示游標(biāo)
開(kāi)發(fā)中比較常用
- 聲明游標(biāo)
declare cursor cursor_name is select * from xxx;
- 打開(kāi)游標(biāo)
open cursor_name;
- 讀取游標(biāo)中的數(shù)據(jù)
fetch curos_name into record(變量)
- 關(guān)閉游標(biāo)
close cursor_name;
實(shí)例
declare
--定義游標(biāo)
cursor cur_xsjbxx is
select * from stuinfo order by stuid;
--定義記錄變量
ls_curinfo cur_xsjbxx%rowtype;
begin
open cur_xsjbxx;--打開(kāi)游標(biāo)
loop
FETCH cur_xsjbxx
INTO ls_curinfo;--獲取記錄值
EXIT WHEN cur_xsjbxx%NOTFOUND;
dbms_output.put_line('學(xué)號(hào):' || ls_curinfo.stuid || ',姓名:' ||
ls_curinfo.STUNAME);
end loop;
close cur_xsjbxx;--關(guān)閉游標(biāo)
end;
解析:配合loop
語(yǔ)句來(lái)循環(huán)打印結(jié)果,通過(guò)游標(biāo)變量%NOTFOUND
來(lái)獲取游標(biāo)的結(jié)束滥壕,跳出loop
纸颜。
顯式游標(biāo)的屬性
- %NOTFOUND.表示游標(biāo)獲是否還能提取數(shù)據(jù)。沒(méi)有數(shù)據(jù)時(shí)返回
TRUE
绎橘,有數(shù)據(jù)時(shí)返回FALSE
胁孙。 - %FOUND。與
%NOTFOUND
相反 - %ISOPEN称鳞。判斷游標(biāo)是否打開(kāi)
- %ROWCOUNT涮较。表示游標(biāo)FETCH INTO獲取了多少記錄數(shù)。
實(shí)例
declare
--定義游標(biāo)
cursor cur_xsjbxx is
select * from stuinfo order by stuid;
--定義記錄變量
ls_curinfo cur_xsjbxx%rowtype;
begin
open cur_xsjbxx;--打開(kāi)游標(biāo)
loop
FETCH cur_xsjbxx
INTO ls_curinfo;--獲取記錄值
EXIT WHEN cur_xsjbxx%NOTFOUND;
--利用游標(biāo)計(jì)數(shù)器打印學(xué)生個(gè)數(shù)
dbms_output.put('%rowcount計(jì)數(shù)器冈止,第'||cur_xsjbxx%rowcount||'位學(xué)生狂票,');
dbms_output.put_line('學(xué)號(hào):' || ls_curinfo.stuid || ',姓名:' ||
ls_curinfo.STUNAME);
end loop;
close cur_xsjbxx;--關(guān)閉游標(biāo)
end;
隱式游標(biāo)
實(shí)例
declare
ls_xsjbxx stuinfo%rowtype;
begin
--查詢學(xué)生信息
select * into ls_xsjbxx from stuinfo t where t.stuid = 'SC201801001';
if sql%found then
dbms_output.put_line('學(xué)號(hào):' || ls_xsjbxx.stuid || ',姓名:' ||
ls_xsjbxx.stuname);
end if;
--查詢學(xué)生信息(不存在的學(xué)生)
select * into ls_xsjbxx from stuinfo t where t.stuid = 'SC201901001';
if sql%found then
dbms_output.put_line('學(xué)號(hào):' || ls_xsjbxx.stuid || ',姓名:' ||
ls_xsjbxx.stuname);
end if;
exception
when no_data_found then
dbms_output.put_line('該學(xué)生SC201901001不存在');
end;