日期:2014-05-16  浏览次数:20511 次

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

        PL/SQL提供了六种游标属性:

游标属性
名字说明举例
%FOUND如果成功取到记录就返回true;否则,返回falsebegin
  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
  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> 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