ORACLE中游标的使用
一般情况下, 查询得到的结果都是多行记录数据, 而在P L/S Q L程序块中S E-LECT语句只能处理查询结果为单行记录数据的情况。要想逐行操作记录数据的值, 需要使用游标。游标是用户定义的引用类型, 它能够根据查询条件从数据库中查询出一组记录, 将其作为一个临时表放置在数据缓冲区中, 以游标作指针, 逐行对记录数据进行操作。
根据Oracle游标的声明方法不同, 可以将Oracle的游标分为隐式游标和显式游标。对于数据操纵语句和单行查询语句来说, Oracle会为它们分配隐式游标。为了处理查询语句返回的多行数据, 必须使用显式游标。当查询返回结果超过一行时, 就需要一个显示游标, 此时用户不能使用SELECT INTO语句。显式游标在PL/SQL块的声明部分声明, 在执行部分或异常处理部分打开、提取数据和关闭。
1 显式游标
1.1 声明游标
在程序中使用游标, 首先必须声明游标。声明游标时, 要用关键字CURSOR, 语法如下。
CURSOR cursor_name IS select statement。
说明:cursor_name用于指定游标的名称;select statement用于指定游标所对应的查询语句。
如CURSOR c_emp IS select empno, ename, salary from emp where salary>2000。
1.2 打开游标
在操作数据之前, 首先要打开游标。打开游标时, Oracle会执行游标所对应的查询语句, 并将查询语句的结果暂存在结果集中。打开游标的语法如下。
OPEN cursor_name。
说明:cursor_name是在声明部分定义的游标名。
OPEN一个游标时, 游标的指针自动的指向活动集的第一条记录。
但是如果打开一个已经打开的游标, 会报错。
ORA-06511:PL/SQL:cursor already open。
1.3 提取数据
在打开游标之后, 从游标得到一行数据使用FETCH命令, 每次提取数据后, 游标都指向结果集的下一行。语法如下。
FETCH cursor_name INTO variable[, variable, ...]。
对于SELECT定义的游标的每一列, FET CH变量列表都应该有一个变量与之相对应, 变量的类型也要相同。
1.4 关闭游标
在提取并处理了结果集的所有数据后, 就可以关闭游标并释放结果集。语法如下。
CLOSE cursor_name。
下面通过一个例子来说明游标的使用。
【例1】游标的使用。
2 循环游标
FOR循环游标是我们常用的一种方法, 它可以简化显式游标的处理代码。在使用FOR循环游标时。ORACLE会隐含地打开游标、提取游标数据并关闭游标。语法如下:
说明:cursor_name是已定义的游标名;record_name是PL/SQL声明的记录变量。此变量的属性声明为%R O W T Y P E类型, 作用域在FOR循环之内。例2为用FOR循环重写的例1的程序。
【例2】循环游标的使用。
3 REF游标
以上所说的隐式游标和显式游标都是静态的, 当用户使用它们的时候查询语句已经确定。如果用户需要在运行的时候动态决定执行何种查询, 则可以使用REF游标和游标变量。
创建REF游标变量需要两个步骤:声明REF游标类型和声明REF游标类型的游标变量。声明REF游标的语法如下。
TYPE ref_cursor_name IS REF CUR-SOR[RETURN return_type]
说明:RETURN语句为可选子句, 用于指定游标提取结果集的返回类型。
【例3】REF游标的使用。
使用游标可以极大方便PL/SQL程序的编写, 就本质而言, 游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来, 使两个数据处理方式能够进行沟通。游标还有很多方面的用法, 还需要我们不断地去学习和研究。
摘要:Oracle游标是PL/SQL的重要组成部分, 在PL/SQL中, 当查询返回结果超过一行时, 就需要用到游标。本文通过例子详细介绍了显示游标的声明、打开、提取数据和关闭, 并且介绍了循环游标和REF游标的使用。
关键词:游标,循环游标,REF游标