游标
游标是指向上下文区域的句柄或指针
上下文区域用于SQL处理的内存区
上下文区域的内容
语句处理的行数
指向语句的语法分析表示的指针
游标的类型
静态游标
隐式游标
显示游标
REF游标(动态游标)
一隐式游标
有ORACLE在内部声明
用于处理
DML语句
返回单行的查询
游标属性
%NOTFOUND 对数据操作成功返回FALSE否则返回TRUE
%FOUND 对数据操作成功返回TRUE否则返回FALSE
%ROWCOUNT 游标影响的行数
%ISOPEN 游标是否打开
begin
insert into cities values(aaabbb);
DBMS_OUTPUTPUT_LINE(游标所影响的行数||SQL%ROWCOUNT);
if SQL%NOTFOUND then
DBMS_OUTPUTPUT_LINE(NOTFOUND为真);
else
DBMS_OUTPUTPUT_LINE(NOTFOUND为假);
end if;
if SQL%FOUND then
DBMS_OUTPUTPUT_LINE(FOUND为真);
else
DBMS_OUTPUTPUT_LINE(FOUND为假);
end if;
if SQL%ISOPEN then
DBMS_OUTPUTPUT_LINE(ISOPEN为真);
else
DBMS_OUTPUTPUT_LINE(ISOPEN为假);
end if;
end;
输出结果为
游标所影响的行数
NOTFOUND为假
FOUND为真
ISOPEN为假
declare
icount int :=;
begin
insert into cities values (aaabbb);
if SQL%NOTFOUND then
DBMS_OUTPUTPUT_LINE(没有插入成功);
else
DBMS_OUTPUTPUT_LINE(插入成功);
end if;
commit;
end;
输出结果为
插入成功
declare
icount int :=;
begin
update cities set country=aaaa;
if SQL%NOTFOUND then
DBMS_OUTPUTPUT_LINE(没有更新成功);
else
DBMS_OUTPUTPUT_LINE(更新成功);
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_OUTPUTput_line(emprowempno|| ||emprowename);
close empCur;
end;
输出结果
SMITH
loop循环
declare
cursor empCur is select * from emp;
emprow emp%ROWTYPE;
begin
open empCur;
loop
fetch empCur into emprow;
DBMS_OUTPUTput_line(emprowempno|| ||emprowename);
DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||行);
exit when empCur%NOTFOUND;
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_OUTPUTput_line(emprowempno|| ||emprowename);
DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||行);
fetch empCur into emprow;
end loop;
close empCur;
end;
输出结果
SMITH
提取了行
ALLEN
提取了行
WARD
提取了行
JONES
提取了行
MARTIN
提取了行
BLAKE
提取了行
CLARK
提取了行
SCOTT
提取了行
KING
提取了行
TURNER
提取了行
ADAMS
提取了行
JAMES
提取了行
FORD
提取了行
MILLER
提取了行
MILLER
提取了行
for循环
循环游标
显式游标的替代方法
它的工作原理是什么
隐式打开游标
自动从活动集获取行
在处理完所有行时关闭游标
优点
简化代码的编写
declare
cursor empCur is select * from emp where sal>&intputsal;绑定变量
iCount int ;
begin
iCount := &Count;
DBMS_outputput_line(iCount);
for emprow in empCur loop
DBMS_OUTPUTput_line(emprowempno|| ||emprowename);
DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||行);
end loop;
end;
三REF游标
在运行时使用不同的语句与之关联
REF游标使用游标变量
游标变量
一种引用类型
可以在运行时指向不同的存储位置
Close 语句关闭游标并释放用于查询的资源
游标变量的类型
具有约束的游标变量
具有返回类型的游标变量
也称为强游标
无约束的游标变量
没有返回类型的游标变量
也称为弱游标
declare
type RefEmpcur is ref cursor return emp%ROWTYPE;
Empcur RefEmpcur;
Emprow emp%ROWTYPE;
flag int := ;
begin
flag := &flag;
if flag= then
OPEN Empcur for select * from emp where sal> and sal<;
elsif flag= then
OPEN Empcur for select * from emp where sal>=;
else
OPEN Empcur for select * from emp;
end if;
loop
fetch Empcur into Emprow;
DBMS_OUTPUTPUT_LINE(Emprowempno);
exit when Empcur%NOTFOUND;
end loop;
close Empcur;
end;
游标变量的限制
不能在程序包中声明游标变量
远程子程序不能接受游标变量的值
不能使用比较操作符对游标变量进行相等或不相等测试
不能将空值赋予游标变量
表不能存储游标变量的值