2012-5-27
9.1显示游标
当在PL/SQL块中执行查询语句(select)和数据操作语句(DML)时,Oracle会为其分配上下文区,游标是指向上下文区的指针。对于数据操纵语句和单行select into语句来说,Oracle会为它们分配隐含游标。为了处理select语句返回的多行数据,开发人员必须使用显示游标,也可以使用select..bulk collect into语句处理。
1.使用显示游标
包括定义游标、打开游标、提取数据和关闭游标四个阶段
(1)定义游标(用于指定游标所对应的select语句)
语法如下:cursor cursor_name is select_statement;
如上所示,cursor_name 用于指定的游标名称;select_statement用于指定游标所对应的select语句。
(2)打开游标 语法:open cursor_name
(3)提取数据
语法一:fetch cursor_name into variable1,variable2,...每次只能提取一行数据
语法二:fetch cursor_name
bulk collect into collect1,collect2...[limit rows]; 每次可以提取多行数据。
如上所示,variable用于指定接收游标数据的变量;collect用于指定接收游标结果的集合变量。注意,当使用语法一时,必须要使用循环语句处理结果集的所有数据。
(4)关闭游标 close cursor_name
2.显示游标属性(用于返回显示游标的执行信息,包括%isopen,%found,%notfound和%rowcount属性)
使用显示游标属性的方法:游标名.属性名
(1)%isopen用于确定游标是否已经打开。
(2)%found用于检查是否从结果集中提取到了数据。
(3)%notfound 与(2)相反
(4)%rowcount 返回当前行为为止已提取到实际行数。示例如下
LOOP
fetch c1 into my_ename,my_deptno;
if c1%rowcount>10 then
...
end if;
...
end loop;
示例一:在显示游标中使用fetch...into语句
示例二 :基于游标定义记录变量
当基于游标定义记录变量时,记录成员名实际就是select语句的列名或列别名。
9.2参数游标
参数游标是指带有参数的游标。在定义了参数游标之后,当使用不同参数值多次打开游标时,可以生成不同的结果集。
语法:cursor cursor_name (parameter_name datatype) is select_satement;
注意:定义参数游标时,游标参数只能指定数据类型,而不能指定长度。另外,定义参数游标时,一定要在游标子查询的where子句中引用该参数,否则失去了定义参数游标的意义。
9.3使用游标更新或删除数据
如果要通过游标更新或删除数据,在定义游标时必须要带有for update子句,语法如下:
cursor cursor_name (parameter_name dataype) is select_statement for update (of column_reference)[nowait];
如上所示,for update子句用于在游标结果集数据上加行共享锁,以防止其他用户在相应行执行DML操作;
of 指定那些表要加锁
nowait 指定不等待锁
在提取了游标数据之后,为了更新或删除当前游标行数据,必须在update或delete语句中引用where current of 子句
语法如下;
update 表名 set 列名=...where current of cursor_name
delete 表名 where current of cursor_name
9.4游标for循环
游标for循环是在PL/SQL块中使用游标最简单的方式,简化了对游标的处理。当使用游标for循环时,Oracle会隐含地打开游标、提取游标数据并关闭游标。使用游标FOR循环的语法如下:
for record_name in cursor_name loop
statement1;
statement2;
end loop;
如上所示,cursor_name是定义的游标名;record_name是Oracle隐含定义的记录变量名。每循环一次提取一次数据。
1.使用游标for循环
2.在游标for循环中直接使用子查询
9.5使用游标变量
PL/SQL的游标变量中存放着指向内存地址的指针。当使用显示游标时,需要在定义部分指定其所对应的select语句;当使用游标变量时,开发人员可以在打开游标变量时指定其所对应的select语句。
1.游标变量使用步骤
在PL/SQL块中使用游标变量包括定义游标变量、打开游标、提取游标数据、关闭游标等四个阶段。具体步骤如下:
(1)定义REF cursor类型和游标变量
为了在PL/SQL块中定义游标变量,必须首先定义ref cursor类型,然后才能定义游标变量。语法:
type ref_type_name is ref cursor [return return_type];
cursor_varialble ref_type_name;
如上所示,ref_type_name用于指定自定义类型,return子句时,其数据类型必须是记录类型。
(2)打开游标
语法:open cursor_varialble for select_statement;
(3)提取游标数据
(4)关闭游标数据
9.6使用cursor表达式