一、什么是游标
简单来理解,在PLSQL中,无论我们查询数据库还是向数据库插入、修改和删除的DML操作,凡是对数据库产生了影响,执行的sql语句都会返回一个由受影响的数据行组成的结果集,而游标就是管理这个结果集的对象。
Oracle中游标分为两种——隐式游标和显式游标,每个sql语句返回的结果集都会默认受‘SQL’这个隐式游标的管理;而显式游标是我们自定义的游标,用来管理特定的SQL语句返回的结果集。
二、通过隐式游标获取查询到的行数
假设有下面的emp表:
如下面的代码,我们在PLSQL的执行块中选中sal大于等于3000的雇员,并打印出共有多少人,就可以通过隐式游标SQL的ROWCOUNT属性来实现。
declare
type emp_varray is varray(20)of emp%rowtype;
v_emps emp_varray;
begin
select * bulk collect intov_emps from emp where sal>=3000;
dbms_output.put_line('sal不小于3000的人数是:'||SQL%rowcount);
end;
/
结果如下:
%ROWOUNT是隐形游标的一个属性,除此之外,它还具有以下属性:
序号 | 属性 | 描述 |
1 | %FOUND | 当执行sql语句返回的结果集不为空时该值为True |
2 | %ISOPEN | 判断游标是否打开,隐形游标中改值恒为False,表示已经打开。 |
3 | %NOTFOUND | 和%Found的判断标准正好相反。 |
4 | %ROWCOUNT | 返回的数据集的行数。 |
三、DML语句中使用隐形游标
3.1 Insert语句中使用隐形游标
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
insert into empvalues(8888,'hyman','clerk',7698,sysdate,3000,200,20);
ifSQL%found then
dbms_output.put_line('插入的人数是:'||SQL%rowcount);
endif;
end;
/
3.2 update 语句中使用隐形游标
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
update emp set sal=10000 where empno=8888;
ifSQL%found then
dbms_output.put_line('修改的人数是:'||SQL%rowcount);
endif;
end;
/
3.3 delete 语句中使用隐形游标
declare
typeemp_varray is varray(20) of emp%rowtype;
v_emps emp_varray;
begin
delete from emp where empno=8888;
ifSQL%found then
dbms_output.put_line('删除的人数是:'||SQL%rowcount);
endif;
end;
/