游标管理

本节要点:

  • l  什么是游标
  • l  显式游标
  • l  隐式游标

1         什么是游标

游标的使用可以让用户像操作数组一样操作查询出来的数据集,这使得使用PL/SQL编程更加方便。实际上,它提供了一种从集合性质的结果中提取单条记录的手段。

1.1       游标的概念

可以简单地理解游标为指向结果集记录的指针,利用游标可以返回它当前指向的行记录(只能返回一行记录)。如果要返回多行,那么需要不断地滚动游标,把想要的数据查询一遍。用户可以操作游标所在位置行的记录。例如,把返回记录作为另一个查询的条件。

1.2       游标的种类

Oracle中游标分为静态游标和REF游标两类。其中,静态游标就像一个数据快照,打开游标后的结果集是对数据库数据的一个备份,数据不随着对表执行DML操作后改变。从这个特性来说,结果集市静态的。由于本人较懒,暂时不对REF游标做介绍。

静态游标包含如下两种类型:

显示游标:是指在使用之前必须有着明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结果集进行检索,使之返回单一的行记录,用户可以操作此记录。关闭游标后,就不能再对结果集进行任何操作。显示游标需要用户自己写代码完成,一切由用户控制。

隐式游标:和显示游标不同,它被PL/SQL自动管理,也被称为SQL游标。由Oracle自动管理。该游标用户无法控制,但能得到它的属性信息。

2         显示游标

通过显示游标用户可以操作返回的数据,使得一些在编程语言中复杂的功能变得更容易实现。

游标语法:

CURSOR cursor_name

[(parameter_name datatype,…)]

IS select_statement;

  • l  CURSOR cursor_name:声明游标,cursor_name是游标的名称
  • l  parameter_name:参数名称
  • l  datatype:参数类型
  • l  select_statement:游标关联的select语句,但该语句不能使select…into…语句

游标的使用步骤:

显示游标的使用顺序可以明确地分为声明游标、打开游标、读取数据和关闭游标四个步骤:

1)         声明游标:用来给游标命名并且使得游标关联一个查询

DECLARE CURSOR cursor_name IS SELECT_STATEMENT

2)         打开游标:游标中任何对数据的操作都是建立在游标被打开的前提下。并且游标一旦打开,其结果集都是静态的,也就是说,此时结果集不会反映出数据库中对数据进行的增加、删除、修改操作。

OPEN cursor_name

3)         读取数据:利用FETCH语句完成,它可以把游标指向位置的记录放入到PL/SQL声明的变量当中。正常的情况下,FETCH要和循环语句一起使用。

FETCH cursor_name INTO Record_Name

4)         关闭游标:释放资源,结果集中的数据将不能做任何操作。

CLOSE cursor_name

循环游标用于简化游标处理代码,当用户需要从游标中提取所有记录时使用。

语法:

FOR <record_index> IN <cursor_name>

LOOP

<executable statements>

END LOOP;

示例:

declare

v_name m_user.user_nm%type;/*声明v_name,与user_nm字段类型一致*/

Cursor cur_stu Is/*定义游标cur_stu*/

/*游标关联查询*/

select t.user_nm from m_user t where t.user_owner_flg = ‘M‘;

begin

Open cur_stu;/*打开游标*/

Loop

/*利用Fetch语句从结果集中提取指针指向的当前行记录*/

Fetch cur_stu Into v_name;

Exit When cur_stu%NotFound;/*集合循环完成时退出循环*/

dbms_output.put_line(‘学生姓名:‘ || v_name);

End Loop;

Close cur_stu;/*关闭游标*/

end;

示例:带参数的显示游标

DECLARE

flag    VARCHAR2(20);

s_code VARCHAR2(5);

s_name    VARCHAR2(20);

CURSOR stu(user_owner_flg VARCHAR2) IS

SELECT t.user_cd, t.user_nm FROM m_user t WHERE t.user_owner_flg = flag;

BEGIN

flag := ‘&flag‘;

OPEN stu(flag);

LOOP

FETCH stu

INTO s_code, s_name;

EXIT WHEN stu%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(s_code || ‘ ‘ || s_name);

END LOOP;

CLOSE stu;

END;

3         隐式游标

没有显示游标一样的可操作性,但是也经常用到。

特点:

  • 在PL/SQL中使用DML语句时自动创建隐式游标
  • 隐式游标自动声明、打开和关闭,默认名称是SQL
  • Select或DML操作产生隐式游标
  • 隐式游标的属性值始终是最新执行的SQL语句

游标的属性有:

  • %FOUND – SQL 语句影响了一行或多行时为 TRUE
  • %NOTFOUND – SQL 语句没有影响任何行时为TRUE
  • %ROWCOUNT – SQL 语句影响的行数
  • %ISOPEN  - 游标是否打开,始终为FALSE

示例:只有在 DML 语句影响一行或多行时,才返回 True

BEGIN

UPDATE m_user t SET t.user_nm = ‘张三丰‘ WHERE t.user_cd = ‘1‘;

IF SQL%FOUNDTHEN

DBMS_OUTPUT.PUT_LINE(‘表已更新‘);

END IF;

END;

示例:如果 DML 语句不影响任何行,则返回 True

DECLARE

v_id   m_user.user_cd%type := ‘&id‘;

v_name m_user.user_nm%Type := ‘&name‘;

BEGIN

UPDATE m_user SET user_nm = v_name WHERE user_cd = v_id;

IF SQL%NOTFOUNDTHEN

DBMS_OUTPUT.PUT_LINE(‘编号未找到。‘);

ELSE

DBMS_OUTPUT.PUT_LINE(‘表已更新‘);

END IF;

END;

示例:返回 DML 语句影响的行数

begin

update m_user t set t.user_nm = ‘CHE‘ where t.user_cd = 1;

if SQL%Found then

dbms_output.put_line(‘修改记录数为:‘ || SQL%RowCount);

else

dbms_output.put_line(‘未找到相应记录‘);

end if;

end;

示例:如果没有与SELECT INTO语句中的条件匹配的行,将引发NO_DATA_FOUND异常

DECLARE

v_id   m_user.user_cd%type;

v_name m_user.user_nm%type;

BEGIN

v_id := ‘&id‘;

SELECT t.user_nm INTO v_name FROM m_user t WHERE t.user_cd = v_id;

DBMS_OUTPUT.PUT_LINE(v_name);

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE(‘课程未找到‘);

END;

示例:如果 SELECT INTO 语句返回多个值,将引发TOO_MANY_ROWS异常

DECLARE

v_flag   m_user.user_owner_flg%type;

v_name m_user.user_nm%type;

BEGIN

v_flag := ‘&flag‘;

SELECT t.user_nm INTO v_name FROM m_user t WHERE t.user_owner_flg = v_flag;

DBMS_OUTPUT.PUT_LINE(v_name);

EXCEPTION

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE(‘该查询提取多行‘);

END;

时间: 2024-10-07 03:13:28

游标管理的相关文章

oracle调优 浅析有效的游标管理

浅析有效的游标管理 [思路分析] 能够把游标理解成共享的运行计划,当sql不被共享时.常规的解决思路有两个方向: 1.调整共享池的尺寸(共享池的库缓存区中共享运行计划): 2.sql书写时尽量重用绑定变量,以起到共享sql的作用. [较差的游标管理体现] 1.不重用运行计划(缺少绑定变量) 2.重用的运行计划保留不下来(共享池尺寸过小)

MySQL 游标管理

在理解了Oracle上的游标之后,再去翻MySQL中关于游标的说明,发现这块讲得比较简单,用一个例子来说明就能理解MySQL游标的使用方法. 游标的使用分为4步:分别是打开游标(open).游标循环(loop,leave).提取数据(fetch).关闭游标(close). 这里使用了Mysql官方文档(5.5)中的例子: CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DEC

Oracle数据库语句大全

转自:http://blog.sina.com.cn/s/blog_b5d14e2a0101c56z.html ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每

Oracle 数据库语句大全

Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束. POREIGN KEY (

Oracle常识

一.Oracle数据类型1.字符数据类型  .>   char:可以存储字母数字值,长度在1到2000个字节.  .>   varchar2:存储可变长度的char类型字符串,大小在1到4000个字节范围内.   .>   long:存储可变长度的字符数据,最多存储2GB. long类型的使用限制:         ************************************** *{ *..  一个表中只有一列可以为long数据类型. *..  long列不能定义为唯一约束

oracle sql语句大全

ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束. POREIGN KEY (外部键)--通过使用公共列在

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录. 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标. 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行.打开游标后,用户可以利用游

『ORACLE』 PLSQL游标的使用(11g)

游标分类 隐式游标: 对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor select update/insert/delete操作 显示游标: 由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor 1.定义游标---cursor  [cursor name]  is 2.打开游标---open    [cursor name] 3.操作数据---fetch    [cursor name] 4.