時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
游標(biāo)
游標(biāo)是指向上下文區(qū)域的句柄或指針
上下文區(qū)域--用于SQL處理的內(nèi)存區(qū)
上下文區(qū)域的內(nèi)容
語(yǔ)句處理的行數(shù)
指向語(yǔ)句的語(yǔ)法分析表示的指針
游標(biāo)的類型
1、靜態(tài)游標(biāo)
隱式游標(biāo)
顯示游標(biāo)
2、REF游標(biāo)(動(dòng)態(tài)游標(biāo))
一、隱式游標(biāo)
有ORACLE在內(nèi)部聲明
用于處理
DML語(yǔ)句
返回單行的查詢
游標(biāo)屬性:
1、%NOTFOUND 對(duì)數(shù)據(jù)操作成功返回FALSE,否則返回TRUE
2、%FOUND? 對(duì)數(shù)據(jù)操作成功返回TRUE,否則返回FALSE
3、%ROWCOUNT? 游標(biāo)影響的行數(shù)
4、%ISOPEN?? 游標(biāo)是否打開(kāi)
begin
insert into cities values('aaa','bbb');
DBMS_OUTPUT.PUT_LINE('游標(biāo)所影響的行數(shù):'||SQL%ROWCOUNT);
if SQL%NOTFOUND then
DBMS_OUTPUT.PUT_LINE('NOTFOUND為真');
else
DBMS_OUTPUT.PUT_LINE('NOTFOUND為假');
end if;
if SQL%FOUND then
DBMS_OUTPUT.PUT_LINE('FOUND為真');
else
DBMS_OUTPUT.PUT_LINE('FOUND為假');
end if;
if SQL%ISOPEN then
DBMS_OUTPUT.PUT_LINE('ISOPEN為真');
else
DBMS_OUTPUT.PUT_LINE('ISOPEN為假');
end if;
end;
輸出結(jié)果為:
游標(biāo)所影響的行數(shù):1
NOTFOUND為假
FOUND為真
ISOPEN為假
declare
icount int :=0;
begin
insert into cities values ('aaa','bbb');
if SQL%NOTFOUND then
DBMS_OUTPUT.PUT_LINE('沒(méi)有插入成功');
else
DBMS_OUTPUT.PUT_LINE('插入成功');
end if;
commit;
end;
輸出結(jié)果為:
插入成功
declare
icount int :=0;
begin
update cities set country='aaaa';
if SQL%NOTFOUND then
DBMS_OUTPUT.PUT_LINE('沒(méi)有更新成功');
else
DBMS_OUTPUT.PUT_LINE('更新成功');
end if;
commit;
end;
輸出結(jié)果為:
更新成功
二、顯式游標(biāo)
由用戶顯式聲明
游標(biāo)將指向活動(dòng)集中的當(dāng)前行
控制顯示游標(biāo)
Open
Fetch
Close
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
fetch empCur into emprow;
DBMS_OUTPUT.put_line(emprow.empno||'? '||emprow.ename);
close empCur;
end;
輸出結(jié)果
7369? SMITH
loop循環(huán)
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
loop
fetch empCur into emprow;
DBMS_OUTPUT.put_line(emprow.empno||'? '||emprow.ename);
DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
--exit when empCur%NOTFOUND;
if empCur%NOTFOUND then
exit ;
end if;
end loop;
close empCur;
end;
#p#副標(biāo)題#e#
while循環(huán)
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
fetch empCur into emprow;
while empCur%FOUND loop
DBMS_OUTPUT.put_line(emprow.empno||'? '||emprow.ename);
DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
fetch empCur into emprow;
end loop;
close empCur;
end;
輸出結(jié)果
7369? SMITH
提取了1行
7499? ALLEN
提取了2行
7521? WARD
提取了3行
7566? JONES
提取了4行
7654? MARTIN
提取了5行
7698? BLAKE
提取了6行
7782? CLARK
提取了7行
7788? SCOTT
提取了8行
7839? KING
提取了9行
7844? TURNER
提取了10行
7876? ADAMS
提取了11行
7900? JAMES
提取了12行
7902? FORD
提取了13行
7934? MILLER
提取了14行
7934? MILLER
提取了14行
for循環(huán)
循環(huán)游標(biāo)
顯式游標(biāo)的替代方法
它的工作原理是什么:
隱式打開(kāi)游標(biāo)
自動(dòng)從活動(dòng)集獲取行
在處理完所有行時(shí)關(guān)閉游標(biāo)
優(yōu)點(diǎn):
簡(jiǎn)化代碼的編寫
declare
cursor empCur is select * from emp where sal>&intputsal;--綁定變量
iCount int ;
begin
iCount := &Count;
DBMS_output.put_line(iCount);
for emprow in empCur loop
DBMS_OUTPUT.put_line(emprow.empno||'? '||emprow.ename);
DBMS_OUTPUT.put_line('提取了'||empCur%ROWCOUNT||'行');
end loop;
end;
三、REF游標(biāo)
在運(yùn)行時(shí)使用不同的語(yǔ)句與之關(guān)聯(lián)
REF游標(biāo)使用游標(biāo)變量
游標(biāo)變量
一種引用類型
可以在運(yùn)行時(shí)指向不同的存儲(chǔ)位置
Close 語(yǔ)句關(guān)閉游標(biāo)并釋放用于查詢的資源
游標(biāo)變量的類型
具有約束的游標(biāo)變量
具有返回類型的游標(biāo)變量、
也稱為"強(qiáng)游標(biāo)"
無(wú)約束的游標(biāo)變量
沒(méi)有返回類型的游標(biāo)變量
也稱為"弱游標(biāo)"
declare
type RefEmpcur is ref cursor return emp%ROWTYPE;
Empcur RefEmpcur;
Emprow emp%ROWTYPE;
flag int := 0;
begin
flag := &flag;
if flag=0 then
OPEN Empcur for select * from emp where sal>500 and sal<1000;
elsif flag=1 then
OPEN Empcur for select * from emp where sal>=1000;
else
OPEN Empcur for select * from emp;
end if;
loop
fetch Empcur into Emprow;
DBMS_OUTPUT.PUT_LINE(Emprow.empno);
exit when Empcur%NOTFOUND;
end loop;
close Empcur;
end;
游標(biāo)變量的限制
不能在程序包中聲明游標(biāo)變量
遠(yuǎn)程子程序不能接受游標(biāo)變量的值
不能使用比較操作符對(duì)游標(biāo)變量進(jìn)行相等或不相等測(cè)試
不能將空值賦予游標(biāo)變量
表不能存儲(chǔ)游標(biāo)變量的值
關(guān)鍵詞標(biāo)簽:ORACLE,PLSQL游標(biāo)
相關(guān)閱讀
熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法