现在的位置: 首页 > 数据库 > 正文

Oracle游标概念、用途与使用详解

2016年04月17日 数据库 ⁄ 共 1722字 暂无评论 ⁄ 阅读 641 次
文章目录

【游标定义】

SQL游标是一种能从包含多条记录的结果集中每次提取一条记录的机制,是系统为用户分配的内存中一处数据缓冲区,用于临时存储从数据库中提取的数据块或指向数据行存储位置的指针。

为什么使用游标?

1)数据处理需要,SELECT语句返回多条记录,不可用SELECT INTO将数据写入变量,此时需要用到游标,方便对数据进行逐条处理。

2)提升性能,游标会将数据提取到内存中,这样在使用时就可避免频繁请求数据库。然而,若游标返回的记录行过多(如上万条),就不可再使用游标,否则会极大的降低性能(内存占用高、消耗CPU)。所以,一般OLTP较常使用游标,但OLAP需要尽量避免使用游标。

【游标分类】

1)静态游标(结果集确定)

显示游标:需显示声明指定结果集,根据使用方式不同又可分为LOOP+FETCH游标和FOR循环游标;

隐式游标:所有DML语句产生隐式游标,可使用游标属性;

2)REF游标动态关联结果集的临时对象,即在运行的时候动态决定执行查询,可以作为参数传递,也可BULK以提高SQL性能;

【游标属性】

%rowcount:游标当前提取的行数;

%isopen:布尔值,游标是否打开,打开为true;

%found:布尔值,取到值则为true;

%notfound:布尔值,取到到值则为true;

【游标语法】

显式游标使用:

LOOP+FETCH游标(不常用):

1)声明游标:划分存储区域,此时并没有执行select语句;与过程相似,游标也是可以带参数的(参数只定义数据类型,不指定大小);

CURSOR cursor_name IS select_stat;

CURSOR cursor_name(parm_name DATATYPE [DEFAULT value]) IS select_stat;

2)打开游标:执行select语句,获得结果集存储到游标中,此时游标指向结果集头,而不是第一条记录;

OPEN cursor_name;

3)提取记录:移动游标指针并提取一条记录,一般该步骤嵌在LOOP循环中以遍历所有结果集,LOOP的终止条件为EXIT WHEN cursor_name%NOTFOUND;

FETCH cursor_name INTO var_1,var_2;

4)关闭游标:将游标放入缓冲池中,没有完全释放资源,可重新打开;

CLOSE cursor_name;

FOR循环游标(较常用):

1)声明游标:同上,不过,该步骤也可省略,直接放到循环中使用,不需要对游标使用的临时变量进行声明(FETCH游标需要声明变量);

2)FOR循环提取记录:循环自动打开游标,创建临时记录类型变量存储记录,并逐条移动游标指针,处理完毕自动关闭游标;

FOR var_1 IN cursor_name LOOP

REF游标(不常用):

1)声明游标为REF类型

TYPE ref_cur_name IS REF CURSOR;

2)声明变量为REF游标类型

ref_var_name ref_cur_name;

3)打开游标并确定结果集:不同于显式游标的select语句在声明部分,该游标的select语句在打开游标部分

OPEN ref_var_name FOR select_stat;

4)提取记录:同显示游标;

5)关闭游标:同显示游标;

【删改游标数据】

删除或修改游标中数据,需要给游标加锁,即使用FOR UPDATE或FOR DELETE。然而,对记录加锁对整个系统的影响较大,故一般情况下不使用游标去删除或修改数据。

在声明游标时,使用OF子句来锁定指定的表,若省略了该子句,在多表查询时会锁定所有表中选择的数据行,单表查询可省略。

语法:

1)声明游标:多表查询不可省略OF子句;

CURSOR cursor_name IS select_stat FOR UPDATE/FOR DELETE [OF update_col_name]

2)打开游标;

3)循环提取游标,并处理数据;

4)UPDATE或DELETE游标记录:条件子句为WHERE CURRENT OF cursor_name;

【游标举例】

参考资料:
http://www.2cto.com/database/201203/122387.html

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?