定义:
在PL/SQL执行增删改查操作时,oracle会在内存中分配一个上下文区域,即缓存区。游标则是指向该区域的一个指针,或者是命名的一个工作区,或者是一种结构化数据类型。他为应用程序提供了一种对具有多行查询结果集中的每一行数据分别进行单独处理的方法。是设计嵌入式sql语句的应用程序的常用编程方式。
游标分为显示游标和隐式游标
显示游标
是用户声明和操作的一种游标。显示游标可以分为:声明游标--->打开游标-->提取游标-->关闭游标4个步骤。
声明游标
游标的声明定义了游标的名称以及和一个select语句关联。语法为:
declare cursor <游标名> is select<语句>;
例如:
declare
name varchar2(20);
address varchar2(200);
cursor stuCursor is select stu_name,stu_address from student;
需要注意的是select语句中不包含into语句,应为into语句是fetch语句(提取游标)的一部分。
打开游标
打开游标的语法是:
open <游标名>;
例如:
declare
name varchar2(20);
address varchar2(200);
cursor stuCursor is select stu_name,stu_address from student;
begin
open stuCursor;
close stuCursor;
end;
打开游标就是执行select语句,将执行的结果集放入内存,游标停在结果集的首部,但不是第一行。
提取游标
提取游标就是运用select语句查询出的结果集逐行的进行所需要的操作。
语法为:
fetch <游标名> into 变量名
或者
fetch <游标名> into PL/SQL记录;
例如:
declare
name varchar2(20);
address varchar2(200);
cursor stuCursor is select stu_name,stu_address from student;
begin
open stuCursor;
fetch stuCursor into name, address;
close stuCursor;
end;
关闭游标
语法:
close <游标名> ;
一旦关闭了游标,就相当于停止了select操作,释放了占用的内存区,再从游标去内容就是非法的了。
完整的例子:
declare
studentNO varchar2(20);
name varchar2(20);
cursor stuCur is select stu_no,stu_name from student;
begin
open stuCur;
fetch stuCur into studentNO,name;
while stuCur%found
loop
fetch stuCur into studentNO,name;
end loop;
close stuCur;
end;
注意;
1)在打开游标之前可以使用:<游标名>%isopen来检测游标是否已经打开,若为true,则无需再执行打开游标操作。
2)使用<游标名>%found 或者<游标名>%notfound来检测游标每执行一行是否返回成功,是否还有后续操作。
3)可以使用<游标名>%rowcount来记录游标所在的位置,也就是游标记录过的行数。可以是用这个来做一些判定操作。
例如:
loop
fetch stuCur into studentNO,name;
exit when stuCur%rowcount =10;
end loop;
用游标也能实现修改和删除操作,但必须在游标定义时指定for子句后面的编辑类,如delete或者update;
例如:
declare
type stu_record is record
(
studentNO varchar2(20) not null :=0,
seat varchar2(20)
);
cursor scur is select stu_name,stu_seat from student;
begin
--open scur;
--fetch scur into name,seat;
for stu_record in scur loop
if stu_record.studentNO ='03' then
update student set stu_seat ='03';
end if;
end loop;
--close scur;
end;
隐式游标:
如果在PL/SQL直接使用select语句进行操作,则隐式的使用了游标,即隐式游标,这种游标无需定义,也无需进行打开和关闭操作。
例如:
begin
select stu_NO,stu_name into stuNo, name from student;
end;
因此使用隐式游标必须有一个into语句。使用隐式游标必须只选一行数据或者只产生一行数据。
游标变量
上面所说的都是与一个SQL相关联,并且在编译该块的时候语句已经是可知的,是静态的。而游标变量则是在运行时与不同的语句相关联,是动态的
它被用于处理多行的查询结果集。
使用游标变量时,必须先声明,然后在运行时必须为其分配内存空间;
声明游标变量
定义游标变量的完整语法是:
type <类型名> is ref cursor;
return <返回类型>;
type是已经被定义的类型,ref关键字指明新的类型必须是一个指向经过定义的类型的指针。
<返回类型>是一个记录类型,它指明了最终由游标变量返回的选择列表的类型。
例如:
declare
type t_studentref is ref cursor;
return student%rowtype;
v_student t_studentref;
begin
open v_student for
select * from student;
end;