语句
1.10.1 显式cursor的处理:
declare声明游标:床和命名一个sql工作区;
open打开游标
fetch提取游标
判断是否empty:结果集中是否有未提取的记录;
close关闭游标
1.10.2 显式cursor的属性:
%isopen, 布尔类型,
%notfound,布尔类型,如果前一个fetch语句没有返回一行记录,其值为true;
%found,布尔,如果前一个fetch语句返回记录,其值为true,与%notfound;
%rowcount,数值,到目前为止,cursor已提取的总行数;
1.10.3 隐式cursor的属性
sql%isopen, 布尔类型,DML执行中未true,结束后为false
sql%notfound,布尔类型,与sql%found返回值相反
sql%found, 布尔类型,值为true表DML操作成功
sql%rowcount, 数值类型,表示DML语句成功执行的数据行数;
1.10.4 cursor的使用
声明
在游标声明中使用标准的select语句,如果需要按照指定的次序处理行,可在查询中使用order by字句;可以在查询中引用变量,但是必须在cursor语句之前声明这些变量
cursor c_service_id(p_cost_id number) is
select id from service where cost_id=p_cost_id;
open
通过open cursor来执行select语句并标识结果集;select语句如果没有返回记录,不会出现异常语法;
open c_service_id(5);
fetch cursor
检索当前行,把值赋给变量;变量可以是record类型或者简单变量;如果是简单变量,要求如下:包含相同数量的变量;把每一个变量和相应的列进行位置匹配。通过循环检测cursor中是否包含数据行;
fetch cursor_name into [var1,var2,…| recore_name];
fetch c_service_id into v_service_id;
1.10.5 结果集提前的控制
使用循环处理显式cursor结果集的多行数据;每次fetch一行,反复进行;使用%notfound属性检测一次不成功的提前操作;使用显式cursor的属性检测每一次的提前是否成功,避免出现无限循环;
1.10.6 关闭游标
处理完结果集中的是数据后,应该关闭cursor;如果需要,可以再次打开该curosr;
cursor一旦关闭,所有和该cursor相关的资源都会被释放,不可以再从关闭的cursor中提前数据,可以引起invalid_cursor错误;
close c_service_id;