数据库——游标
来源:互联网 发布:土地利用空间优化配置 编辑:程序博客网 时间:2024/06/05 19:39
原文地址: http://blog.csdn.net/liujiahan629629/article/details/18014051
一,游标是什么?
游标是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响到的数据。通俗理解就是将受影响的数据暂时放到了一个内存区域的虚表中,而这个虚表就是游标。
二,作用是什么?
1,大家都知道数据库中的事物可以回滚,而游标在其中起着非常重要的作用,由于对数据库的操作我们会暂时放在游标中,只要不提交,我们就可以根据游标中内容进行回滚,在一定意义有利于数据库的安全。
2,另外,在Oracle中PL/SQL只能返回单行数据,而游标弥补了这个不足。相当于ADO.NET中的Datatable吧。
三,类型:
1,隐式游标:增删改等操作Oracle都会自动创建游标,暂时保存操作结果,也就是能够回滚的操作都会引发游标的创建。
2,显示游标:由开发人员通过程序显式控制,用于从表中取出多行数据,并将多行数据一行一行的单独进行处理.
四,属性:
属性
注释
%rowcount
受SQL影响的行数
%found
Boolean值,是否还有数据
%notfound
Boolean值,是否已无数据
%isopen
游标是否打开
当然如果我们想获得隐式游标的属性,通过%前边加上SQL即可得到。例如SQL%rowcount.
五,游标简单认识了,我们来看看游标的具体使用:
1,先看一下简单的使用游标四步骤:
步骤
关键词
说明
1
在DECLARE中cursor
声明游标,创建一个命名的查询语句
2
Open
打开游标
3
Fetch
取出游标中的一条记录装入变量
4
Close
释放游标
2,当然游标中可以存放一条数据,也可以存放多条数据,后者是我们用游标,前者我们通过PL/SQL语句即可完成的,这样我们在这里就必须用到循环结构了,在Oracle数据库中我们可以使用while……loop……end loop , for…… loop……end loop,loop……end loop。在这里需要提出的是,for循环结构在Oracle中被简化了,我们只需要声明和使用即可。看下边这个例子吧:
a,whlie循环结构的:
- declare
- --定义记录类型的变量
- v_user user%rowtype;
- --1,利用cursor关键字声明游标
- cursor user_cur is
- select * from user;
- begin
- --2,打开游标
- open user_cur;
- --3,利用fetch读取数据
- fetch user_cur
- into v_user;
- while user_cur%found loop
- dbms_output.put_line(v_user.userName);
- fetch user_cur
- into v_user;
- end loop;
- --4,释放游标
- close user_cur;
- end;
- declare
- --1,利用cursor关键字声明游标
- cursor user_cur is
- select * from user;
- begin
- --2,直接使用,Oracle会自动打开和关闭等操作。
- for v_user in user_cur loop
- dbms_output.put_line(v_user.userName);
- end loop
- end;
这里就介绍这两种的类型,loop的和这都差不多。
3,最后在这里再学习一下带参数的游标,也是就和我们但参数的类是一样的,只不过一个用在了数据库中,一个用在了编程语言中。
- declare
- --定义记录类型的变量
- v_User user%rowtype;
- --1,利用cursor关键字声明带参数的游标
- cursor user_Cur(v_UserNo number) is
- select * from user where userNo=v_UserNo;
- begin
- --2,打开带参数的游标,使之更加灵活 。
- open user_C
DECLARE CURSOR语句SQL-92标准语法格式:
DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
Eg:
Declare MycrsrVar Cursor
FOR Select * FROM tbMyData
2.2 打开游标
OPEN MycrsrVar
当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:
FETCH FIRST from E1cursor
或 FETCH NEXT from E1cursor
2.3 使用游标操作数据
下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动
/* 使用游标读取数据的操作如下。*/
DECLARE E1cursor cursor /* 声明游标,默认为FORWARD_ONLY游标 */
FOR SELECT * FROM c_example
OPEN E1cursor /* 打开游标 */
FETCH NEXT from E1cursor /* 读取第1行数据*/
WHILE @@FETCH_STATUS = 0 /* 用WHILE循环控制游标活动 */
BEGIN
FETCH NEXT from E1cursor /* 在循环体内将读取其余行数据 */
END
CLOSE E1cursor /* 关闭游标 */
DEALLOCATE E1cursor /* 删除游标 */
2.4 关闭游标
使用CLOSE语句关闭游标
CLOSE { { [ GLOBAL ] 游标名 } | 游标变量名 }
使用DEALLOCATE语句删除游标,其语法格式如下:
DEALLOCATE { { [ GLOBAL ] 游标名 } | @游标变量名
3. FETCH操作的简明语法如下:
FETCH
[ NEXT | PRIOR | FIRST | LAST]
FROM
{ 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
参数说明:
NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
--------------------------------------------------------------------------------------------------------------------------------
每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
・ 0 表示成功执行FETCH语句。
・ -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
・ -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。
- 数据库——游标
- 数据库——游标
- 数据库——游标
- 数据库——游标
- 数据库——游标
- 数据库——游标
- 数据库——游标
- 数据库中的书签——游标
- 数据库笔记五——游标
- 再看数据库——(7)游标
- 认识——数据库存储过程和游标
- 数据库对象——函数,视图,同义词,游标,包
- 数据库---游标
- 数据库游标
- 数据库游标
- 数据库游标
- 数据库 游标
- 数据库 ---游标
- Android CardView 在eclipse中如何构建项目
- Web Service学习笔记
- 【内部排序】二:折半插入排序(binary insertion sorting)实现(源码)
- hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)等
- mysql数据类型java对应
- 数据库——游标
- perception感知器算法的C语言实现代码
- Qt4项目向Qt5项目迁移的注意事项
- go语言-使用swig转化C++代码为go所用
- HttpRuntime.Cache用法
- oracle.jbo.domain Class ClobDomain
- 分布式哈希表
- leetcode Number of Islands
- 兼容性及经验汇总