游标
指向上下文区域的句柄或指针
游标在服务器段存储
属性
%NOTFOUND 没有找到结果或没有操作成功
%FOUND 找到结果或操作成功
%ROWCOUNT 游标影响的行数
%ISOPEN 游标是否打开 隐式游标系统自动维护,永远为假
类型:
静态游标
-隐式游标
在oracle内部声明
用于处理DML语句和返回单行的查询
SQL为隐式游标默认名称,例:
begin
insert into student values('3','test','m',sysdate);
dbms_output.put_line('游标影响的行数:'||SQL%ROWCOUNT);
end;
-显式游标
由用户显示声明
游标指向活动集的当前行
控制显示游标
Open 打开游标
Fetch … into …
Close 关闭游标
declare
cursor stuCur is select * from student;
stuRow student%rowtype;
begin
open stuCur;
loop
fetch stuCur into sturow;
exit when stuCur%NotFound;
dbms_output.put_line(sturow.stu_name);
dbms_output.put_line(stuCur%RowCount);
end loop;
close stuCur;
end;
REF游标(动态游标)
在运行时使不同的语句与之关联
REF游标使用游标变量
游标变量:一种引用类型,可以在运行时指向不同的存储位置,close语句关闭游标并释放用于查询的资源。
类型:
有约束的游标变量:具有返回类型 定义游标时加上return 游标类型
declare
type RefstuCur is ref cursor return stu%rowtype;
stuCur RefstuCur;
sturow student%rowtype;
flag int :=0;
begin
flag := &flag;
if flag = 0 then
open stucur for select * from student where stu_id <= '2';
else
open stucur for select * from student where stu_id > '2';
end if;
loop
fetch stuCur into sturow;
exit when stuCur%NotFound;
dbms_output.put_line(sturow.stu_name);
end loop;
end;
无约束的游标变量:无返回类型
declare
type RefstuCur is ref cursor;
stuCur RefstuCur;
sturow student%rowtype;
flag int :=0;
begin
flag := &flag;
if flag = 0 then
open stucur for select * from student where stu_id <= '2';
else
open stucur for select * from student where stu_id > '2';
end if;
loop
fetch stuCur into sturow;
exit when stuCur%NotFound;
dbms_output.put_line(sturow.stu_name);
end loop;
end;
由于在for循环中会自动打开游标,无哦一REF游标不能再for循环中使用!
for stuRow in stuCur loop
…
end loop;
游标限制:
不能再程序包中声明游标变量
远程子程序不能接受游标变量的值
不能使用比较操作符对游标变量进行相等或不相等测试
不能将空值赋予游标变量
表不能存储游标变量的值