游標
游標是指向上下文區域的句柄或指針
上下文區域
上下文區域的內容
語句處理的行數
指向語句的語法分析表示的指針
游標的類型
隱式游標
顯示游標
一
有ORACLE在內部聲明
用於處理
DML語句
返回單行的查詢
游標屬性
begin
insert into cities values(
DBMS_OUTPUT
if SQL%NOTFOUND then
DBMS_OUTPUT
else
DBMS_OUTPUT
end if;
if SQL%FOUND then
DBMS_OUTPUT
else
DBMS_OUTPUT
end if;
if SQL%ISOPEN then
DBMS_OUTPUT
else
DBMS_OUTPUT
end if;
end;
輸出結果為
游標所影響的行數
NOTFOUND為假
FOUND為真
ISOPEN為假
declare
icount int :=
begin
insert into cities values (
if SQL%NOTFOUND then
DBMS_OUTPUT
else
DBMS_OUTPUT
end if;
commit;
end;
輸出結果為
插入成功
declare
icount int :=
begin
update cities set country=
if SQL%NOTFOUND then
DBMS_OUTPUT
else
DBMS_OUTPUT
end if;
commit;
end;
輸出結果為
更新成功
二
由用戶顯式聲明
游標將指向活動集中的當前行
控制顯示游標
Open
Fetch
Close
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
fetch empCur into emprow;
DBMS_OUTPUT
close empCur;
end;
輸出結果
loop循環
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
loop
fetch empCur into emprow;
DBMS_OUTPUT
DBMS_OUTPUT
if empCur%NOTFOUND then
exit ;
end if;
end loop;
close empCur;
end;
while循環
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
fetch empCur into emprow;
while empCur%FOUND loop
DBMS_OUTPUT
DBMS_OUTPUT
fetch empCur into emprow;
end loop;
close empCur;
end;
輸出結果
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
提取了
for循環
循環游標
顯式游標的替代方法
它的工作原理是什麼
隱式打開游標
自動從活動集獲取行
在處理完所有行時關閉游標
優點
簡化代碼的編寫
declare
cursor empCur is select * from emp where sal>&intputsal;
iCount int ;
begin
iCount := &Count;
DBMS_output
for emprow in empCur loop
DBMS_OUTPUT
DBMS_OUTPUT
end loop;
end;
三
在運行時使用不同的語句與之關聯
REF游標使用游標變量
游標變量
一種引用類型
可以在運行時指向不同的存儲位置
Close 語句關閉游標並釋放用於查詢的資源
游標變量的類型
具有約束的游標變量
具有返回類型的游標變量
也稱為
無約束的游標變量
沒有返回類型的游標變量
也稱為
declare
type RefEmpcur is ref cursor return emp%ROWTYPE;
Empcur RefEmpcur;
Emprow emp%ROWTYPE;
flag int :=
begin
flag := &flag;
if flag=
OPEN Empcur for select * from emp where sal>
elsif flag=
OPEN Empcur for select * from emp where sal>=
else
OPEN Empcur for select * from emp;
end if;
loop
fetch Empcur into Emprow;
DBMS_OUTPUT
exit when Empcur%NOTFOUND;
end loop;
close Empcur;
end;
游標變量的限制
不能在程序包中聲明游標變量
遠程子程序不能接受游標變量的值
不能使用比較操作符對游標變量進行相等或不相等測試
不能將空值賦予游標變量
表不能存儲游標變量的值
From:http://tw.wingwit.com/Article/program/Oracle/201311/18224.html