1、理解游标(2)游标的属性介绍及不同游标类别的案例演示相关链接:理解游标(1):游标的概述PL/SQL 提供了六种游标属性:游标属性名字 说明 举例%FOUND 如果成功取到记录就返回 true;否则,返回 false beginupdate t set name=f where id=2;if SQL%FOUND thendbms_output.put_line(cursor );end if;end;%NOTFOUND 如果没有成功取到记录就返回 true;否则,返回 false %FOUND 和%NOTFOUND 是相反属性,到底什么时候使用%FOUND 什么时候又该用%NOTFOUND
2、呢?要看使用哪一个属性表达得最自然,比如: exit when not sql%foundexit when sql%notfound显然,后者更自然%ROWCOUNT 返回到目前为止,已经从游标中取出的记录数量 beginupdate 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
3、 thenif cursor_name%ISOPEN thenclose cursor_name;end if;%BULK_ROWCOUNT 返回 forall 语句修改的记录数量 %BULK_EXCEPTIONS 返回 forall 语句修改记录时出现的异常信息 我们可以在 pl/sql 中使用这些游标属性,但不能再 sql 语句中使用要使用一个游标属性,只需要在游标名字或游标变量后面加上%就可以,比如:cursor_name%attribute_name对于一个隐式游标,游标的名字固定就是“SQL”,比如 SQL%FOUND下面以 t 表为例,对各种游标类别作简单使用介绍sql SQL r
4、ollback; 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 的记录不
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 rowVa
6、lue; -取出游标内的值放到 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 w
7、here 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 whe
8、n 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
9、 connect by level = 10; begin for rowValue in rowList loop -rowValue 是每条记录不需要事先声明,rowList 是集合中的所有记录 dbms_output.put_line(rowValue.a);-取出集合中的值进行打印 end loop; end; declare begin -可以将 select 语句 for xx in 内,无论传参或是嵌套更为方便简洁。 for rowValue in (select level a from dual connect by level =10) loop for rv in (se
10、lect name from t where t.id = rowValue.a) loop dbms_output.put_line(rv.name );-将取到的值打印。 end loop; end loop; end; -这种是最简单的游标 declare begin for rowValue in 1.10 loop dbms_output.put_line(rowValue);-将取到的值打印,如果查询只有一个字段这里只需写变量名即可。 end loop; end; REF 游标实例:sql declare type cus_cur_type is ref cursor return
11、 t%rowtype; -强类型 Ref 游标,查询的 sql 必须返回 t 表类型 -type cus_cur_type is ref cursor;弱类型 Ref 游标,返回类型没有限制 rowList cus_cur_type; - 声明游标变量 rowValue t%rowtype; -声明行变量 begin open rowList for select * from t; -打开游标,并关联 sql loop fetch rowList into rowValue; -按行取出数据 exit when rowList%notfound;-判断是否还存在记录,如果不存在终止游标 dbms_output.put_line(rowValue.name);-将取到的值打印,如果查询只有一个字段这里只需写变量名即可。 end loop; close rowList;-关闭游标 end;