先上简单的例子,在oracle默认用户scott中可以运行
declare
cursor cur_1 is --声明游标cur_1 语法: cursor
游标名 is 查询语句
select * from emp;
e cur_1%rowtype; -- %rowtype属性 表明为游标获取的一行数据对象 可以用e.列名 访问获取的数据
begin
if not cur_1%isopen then --%isopen属性 判断游标是否打开
open cur_1;
end if;
dbms_output.put_line(cur_1%rowcount);--游标执行最后fetch操作,取到的行数
输出0 因为无fetch操作
fetch cur_1 into e;
while cur_1%found loop --最后一次执行fetch操作是否从游标取到一行数据,取到为true
dbms_output.put_line(cur_1%rowcount||' '||e.empno||' '||e.ename||' '||e.job);
fetch cur_1 into e;
end loop;
dbms_output.put_line(cur_1%rowcount);
close cur_1;
end;
oracle游标是一种私有的工作区,用于保存SQL语句的执行结果。Oracle数据库中有两种形式的游标:隐式游标(系统自带的 比如SQL)和 显示游标(用户自定义 )。
上面例子,可以初步了解到游标的基本属性:%isopen %fount %notfound %rowcount 并且基本的游标操作。
总结:1。oracle游标 分为两种,一种是oracle服务自带的,为隐式游标 ;第二种是用户可以自定义的显式游标。
隐式游标和显示游标在某些基本属性上是有区别的:
%rowcount :
隐式: 其值是对于DML操作中受影响的数据行数。特别对于select语句 不发生异常其值为1. 这里注意select操作不发生异常只有情况一种,那就是查询结果有且只有一条结果返回。 因为当无结果时,会抛出NO_DATA_FOUND异常,当有多行数据时,返回TOO_MANY_ROWS异常。
显式:表明目前为止,用fetch语句已经获取到的行数。当无fetch操作是,其值为0;
%found:
隐式:对于DML操作中是否有数据受到影响。如果没有任何数据受到影响,其值为false。特别对于select操作,不发生异常其值为true.这里就可以知道什么查询结果为true了吧。
显示:表示最后一次fetch语句是否从游标中取到了数据,取到了为ture,没有取到为false.
2.显示游标也可以分为两种,一种带参数的,一种不带参数的。™定义如下:
declare
cursor 游标名(参数1,参数2,.....)
is select 语句
[for update ]--锁定游标查询的数据
其中参数列表格式为: 参数名 传递模式 参数类型 := 默认值;传递模式包括三种 in 、out 、 in out
使用游标方式
一般方式:
打开游标 :open 游标名;
获取游标内容: fetch 游标名 into 对应的参数,这里可以使用%rowtype属性 获取游标对应的“行对象类型”
关闭游标:close 游标名。
所以步骤大致为:declare -> opne -> fetch -> close
由于游标更多的时间是获取多行记录,所以结合游标自身属性,通过循环语句进行遍历。这样就需要对各个属性有很清楚的认识。通过上面例子详细阐述了。先指出一个比较特别的循环for,在for循环中使用游标 无需打开、获取和关闭操作,都能很好的自动 完成。
使用格式:
for 变量名 in 游标名[(参数值...)] loop
end loop; 是时候将上面例子用for循环试试了!