日期:2014-05-16 浏览次数:20511 次
PL/SQL提供了六种游标属性:
名字 | 说明 | 举例 |
%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呢? 要看使用哪一个属性表达得最自然,比如: exit when not sql%found exit when sql%notfound 显然,后者更自然 |
%ROWCOUNT | 返回到目前为止,已经从游标中取出的记录数量 | begin 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> rollback; Rollback complete SQL> select * from t; ID NAME ---------- -------------------- 1 a 2 b 3 c 4 d 5 e
① 隐式游标实例:
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;
② 无参显式游标实例:
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; --取出游标内的值放到row