游标的小知识(转载and整理)
一、游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来从上往下移动,从而达到遍历每条记录的作用)
游标也可以理解为逐行返回SQL语句的结果集
如何编写一个游标?
1、声明游标
declare cursor cur_name
is + 想要进行的操作;
定义数据的方式type/rowtype;
2、打开游标
open cur_name;
3、提取数据
fetch
4、关闭游标
eg:提取t_emp中的数据
declaer cursor cur
is select * from t_emp;
r_emp t_emp%rowtype;
begin
open cur;
fetch cur into r_emp;
dbms_output.put_line('id:'||r_emp.id);
close;
end;
5.释放游标
Deallocate cur_name
如何判断是否到了结果集的尾部,
oracle中,对于游标的属性,它通过属性值来判断的
1)%notfound 到了游标尾部,没有记录了,就返回true
2)%found 用于检验游标是否成功,通常在fetch语句前使用,当游标按照条件查询一条记录是,返回true
3)%isopen 判断游标是否打开
4)rowcount 获得影响的行数
二、游标的分类:
1、静态游标 在执行前,明确知道sql语句游标
a) 显示游标
用户自己写的sql语句,编译时能明确知道sql语句
b) 隐式游标
Dml(增、删、改、查询单条记录)会用隐式游标,该变量名不需要用户自己声明,
它由系统帮我们定义,叫sql。
影视游标的使用:通过%rowcour判断是有使用了。 使用时不要字机定义应是游标,它由系统定义
2、动态游标 在执行前不知道sql语句游标,执行时才知道sql语句的游标。
a) 强类型游标
b) 弱类型游标
三、游标的作用:(拿出结果集中的一行)
游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,
将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。
尽管游标能遍历结果中的所有行,但他一次只指向一行。
概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。
游标提供了在逐行的基础上操作表中数据的方法。
游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,
那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。
四,对于游标的的优化建议
- 如果能不用游标,尽量不要使用游标
- 用完用完之后一定要关闭和释放
- 尽量不要在大量数据上定义游标
- 尽量不要使用游标上更新数据
- 尽量不要使用insensitive, static和keyset这些参数定义游标
- 如果可以,尽量使用FAST_FORWARD关键字定义游标
- 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数