3.8 游标的应用
游标是一种私有的工作区,用于保存SQL语句的执行结果。在执行一条SQL语句时,数据库服务器会打开一个工作区,将SQL语句的执行结果保存在这里。
在Oracle数据库中有两种形式的游标:隐式游标和显式游标。隐式游标是由数据库服务器定义的,显式游标是用户根据需要自己定义的。
3.8.1 隐式游标
隐式游标是数据库服务器定义的一种游标。在执行一条DML语句或SELECT语句时,数据库服务器将自动打开一个隐式游标,存放该语句的执行结果。在一个PL/SQL块中可能有多条DML或SELECT语句,隐式游标始终存放最近一条语句的执行结果。
隐式游标有几个很有用的属性,可以帮助我们了解游标的信息。表3.6列出了隐式游标的几个常用属性。
其中SQL%FOUND属性值为布尔值,表示是否找到了满足条件的数据,如果找到了相应的数据,其值为TRUE,否则为FALSE。SQL%ROWCOUNT属性表示某个操作影响的数据行数,对于UPDATE语句,表示修改的行数;对于INSERT语句,表示插入的行数;对于DELETE语句,表示被删除的行数。例如,可以在每一条DML语句之后输出该操作影响的行数。
BEGIN
UPDATE emp set sal=sal+100;
if SQL%FOUND then
dbms_output.put_line('被修改的行数:'||SQL%ROWCOUNT);
END if;
DELETE FROM emp;
if SQL%FOUND then
dbms_output.put_line('被删除的行数:'||SQL%ROWCOUNT);
END if;
INSERT INTO dept VALUES(70,'aaa','aaaa');
INSERT INTO dept VALUES(80,'bbb','bbbb');
if SQL%FOUND then
dbms_output.put_line('最近插入的行数:'||SQL%ROWCOUNT);
END if;
ROLLBACK;
END;
这个块的执行结果为:
SQL>/
被修改的行数:14
被删除的行数:14
最近插入的行数:1
PL/SQL 过程已成功完成
从这个例子可以看出,当有多条DML语句时,隐式游标只记录最近一条DML语句的执行情况。如果是SELECT语句,情况则比较特殊。因为当SELECT语句没有检索到满足条件的数据时,将引发NO_DATA_FOUND异常,而当检索到多行满足条件的数据时,将引发TOO_MANY_ROWS异常。所以只有当SELECT语句正好检索到一行数据时,才可以使用隐式游标的这些属性。如果要处理这两种特殊情况,就需要借助于显式游标。