最新历史版本 :游标 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概念编辑

在数据库中, 游标是一个十分重要的概念。游标是一种能从包括多条数据记录的结果集中,每次提取一条记录的机制。

用 SQL 语言从数据库中检索数据后,结果放在内存的一块区域中,往往是一个含有多个记录的集合。游标机制允许用户在此结果集内逐行访问每条记录,并按照用户自己的意愿来显示和处理这些记录。


2. 标准写法(以 Oracle 为例)编辑

declare
cursor mycur is select *from books;----定义游标
myrecord books%rowtype; ----%rowtype表示行数据类型,myrecord存储books中的一行数据
begin
open mycur;
fetch mycur into myrecord; ----存入一行数据至myrecord
while mycur%found loop ----%found布尔型,如果有行返回,则为true
dbms_output.put_line(myrecord.books_id||','||myrecord.books_name); ---输出信息
fetch mycur into myrecord; ----存入下一行
end loop;
close mycur;---关闭游标
end;

/

说明:

使用游标逐行访问查询 books 表获得的结果集,输出每条记录中的 bookid 与 bookname。从该例子可以看出,游标包含两方面的内容:

游标结果集:执行其中的 select 语句所得到的结果集。

游标位置:一个指向游标结果集内的某一条记录的指针。

利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。一般使用完后不写 close mycur 也不会出现编译错误。


3. 游标的优点编辑

允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作;

它还提供对基于游标位置而对表中数据进行删除或更新的能力;

游标作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

上面章节,我们对游标的内容有了些详细的了解。但在使用游标时,往往会出现些问题。下面就打开的游标太多时,出现的一些问题作介绍。


4. 常见报错编辑

如:在 Oracle 数据库中,会报如下信息:

Caused by: ORA-01000: 超出打开游标的最大数

Oracle 系统中,以参数 open_cursors 来限制打开的游标数,当打开游标超过这个数的时候就会报这个错,提示超出打开游标的最大数。游标个数理论上没有上限,也不是越大越好。

有这样一个测试显示:当这个 open_cursor 数值大了一定程度之后,会使得内存缩水,缩水的表现就是连接数减少。

如上结论可具体测试,其测试结果如下:

分别设置为以下值,测试数据库的连接,在同样的内存配置下,与用户可以连接的数(独占模式)有很大的区别。

open_cursors=6000000000 -------------连接数 45

open_cursors=300 ---------------------连接数超过 500.

由以上测试可知,当 open_cursors 扩大 2000 万倍之后连接数变为原来的十分之一,因此 open_cursors 的大小对连接数的影响不大,只要不要在千万级上增加,一般的几千几万跟几十,对连接数的影响甚微。


4.1 解决方案

按照游标的正规写法,打开游标使用完之后,就需关闭游标。

应避免游标打开过大,其可通过修改 open_cursors 大小,使其尽可能大。


4.2 检查 open_cursors 数值及修改方法

SQL>show parameter open_cursors; ---显示参数值

SQL>alter system set open_cursors = 1000; ---修改参数值为1000

SQL>commit;----提交


修改成功。