理解游标(2)游标的属性介绍及不同游标类别的案例演示(一)

2014-11-24 16:43:38 · 作者: · 浏览: 5
理解游标(2)游标的属性介绍及不同游标类别的案例演示
相关链接:
理解游标(1):游标的概述
http://www.2cto.com/database/201212/177395. html
PL/SQL提供了六种游标属性:
游标属性 www.2cto.com
名字 说明 举例
%FOUND 如果成功取到记录就返回true;否则,返回false begin
update t set name='f' where id=2;
if SQL%FOUND then
dbms_output.put_line('cursor attribute');
end if;
end;
%NOTFOUND 如果没有成功取到记录就返回true;否则,返回false %FOUND和%NOTFOUND是相反属性,到底什么时候使用%FOUND什么时候又该用%NOTFOUND呢?
要看使用哪一个属性表达得最自然,比如: www.2cto.com
exit when not sql%found
exit when sql%notfound
显然,后者更自然
%ROWCOUNT 返回到目前为止,已经从游标中取出的记录数量
begin
update t set name='f' where id=2;
dbms_output.put_line('rows selected: '||sql%rowcount);
end;
rows selected: 1
%ISOPEN 如果游标是打开的就返回true;否则,返回false 通常用在确保当发生异常情况后游标不会一直打开着而不关闭
exception
when others then
if cursor_name%ISOPEN then
close cursor_name;
end if;
%BULK_ROWCOUNT 返回forall语句修改的记录数量
%BULK_EXCEPTIONS 返回forall语句修改记录时出现的异常信息
我们可以在pl/sql中使用这些游标属性,但不能再sql语句中使用
要使用一个游标属性,只需要在游标名字或游标变量后面加上%就可以,比如:cursor_name%attribute_name
对于一个隐式游标,游标的名字固定就是“SQL”,比如SQL%FOUND
下面以t表为例,对各种游标类别作简单使用介绍
[sql]
SQL> rollback;
Rollback complete
SQL> select * from t;
ID NAME
---------- --------------------
1 a
2 b
3 c
4 d
5 e
① 隐式游标实例:
[sql]
begin
--执行DML操作
update t set name = 'ff' where id = 5;
--判断是否有受影响行
if sql%found then
--打印受影响行数
dbms_output.put_line('影响行数:' || sql%rowcount);
end if;
--判断是否没有受影响行
if sql%notfound then
dbms_output.put_line('id为5的记录不存在');
end if;
end;
② 无参显式游标实例:
[sql]
declare
--声明游标表变量并关联sql
cursor rowList is
select * from t;
--声明行变量
--如果上面的查询语句只有一个查询字段,这里也可以使用正常的变量声明方式(v_rowValue varchar2(20);)。
rowValue t%rowtype;
begin
open rowList; --打开游标
--如果确定游标中只有一条记录的话,loop和end loop可以不写,而exit必须存在于游标循环内,所以也不需要写。
loop
fetch rowList
into rowValue; --取出游标内的值放到rowValue中
exit when rowList%notfound; --判断是否还存在记录,如果不存在终止游标
dbms_output.put_line(rowValue.name); --将取到的值打印,如果查询只有一个字段这里只需写变量名即可。
end loop;
close rowList; --关闭游标
end;
③ 有参显式游标实例:
[sql]
declare
--声明带参数的游标变量并关联sql,并将参数与sql进行关联
cursor rowList(c_name varchar2, c_id number) is
select * from t where t.name = c_name and t.id = c_id;
--声明行变量
--如果上面的查询语句只有一个查询字段,这里也可以使用正常的变量声明方式(v_rowValue varchar2(20);)。
rowValue t%rowtype;
begin
open rowList('Think', 1); --打开游标,并将参数给出
--如果确定由表中只有一条记录的话,loop和end loop可以不写,而exit必须存在于游标循环内,所以也不需要写。
loop
fetch rowList
into rowValue; --取出游标内的值放到rowValue中
exit when rowList%notfound;--判断是否还存在记录,如果不存在终止游标
dbms_output.put_line(rowValue.name); --将的到的值打印,如果查询只有一个字段这里只需写变量名即可。
end loop;
close rowList; --关闭游标
end;
④ 游标FOR循环实例:
游标FOR循环不需要手动进行打开和管理操作,全部由PL/SQL引擎进行管理
FOR oo in xx 等同于fetch xx into oo;
[sql]
declare
--声明游标变量并关联sql
cursor rowList is
select level a from dual connect by level <= 10;
begin
for rowValue in rowList loop
--rowValue是每条记录不需要事先声明,rowLis