PL/SQL编程_游标

游标是一种私有的工作区,用于保存SQL语句的执行结果。
在执行一条SQL语句时,数据库服务器会打开一个工作区,将SQL语句的执行结果保存在这里。
在Oracle数据库中有两种形式的游标:隐式游标和显式游标。
隐式游标是由数据库服务器定义的,显式游标是用户根据需要自己定义的。

隐式游标
隐式游标是数据库服务器定义的一种游标。
在执行一条DML语句或SELECT语句时,数据库服务器将自动打开一个隐式游标,存放该语句的执行结果。
在一个PL/SQL块中可能有多条DML或SELECT语句,隐式游标始终存放最近一条语句的执行结果。
隐式游标有几个很有用的属性,可以帮助我们了解游标的信息。
下面列出了隐式游标的几个常用属性。
SQL%ISOPEN 判断当前游标是否打开。如果打开,该属性值为TRUE,否则为FALSE
SQL%ROWCOUNT 对于DML语句,该属性值为受影响的数据行数。对于SELECT语句,如果不发生异常,其值为1
SQL%FOUND 对于DML语句,该属性表明表中是否有数据受到影响。如果DML语句没有影响任何数据,该属性值为FALSE,否则为TRUE。对于SELECT语句,如果不发生异常,其值为TRUE
SQL%NOTFOUND 与属性SQL%FOUND正好相反
其中SQL%FOUND属性值为布尔值,表示是否找到了满足条件的数据,如果找到了相应的数据,其值为TRUE ,否则为FALSE 。
SQL%ROWCOUNT属性表示某个操作影响的数据行数,对于UPDATE语句,表示修改的行数;对于INSERT语句,表示插入的行数;对于DELETE语句,表示被删除的行数。
例如,可以在每一条DML语句之后输出该操作影响的行数。
BEGIN
UPDATE emp set sal=sal+100;
if SQL%FOUND then
dbms_output.put_line(‘被修改的行数:‘ || SQL%ROWCOUNT);
END if;
DELETE FROM emp;
if SQL%FOUND then
dbms_output.put_line (‘被删除的行数:‘ || SQL%ROWCOUNT);
END if;
INSERT INTO dept VALUES(70 ,‘ aaa ‘,‘ aaaa ‘);
INSERT INTO dept VALUES(80 ,‘bbb ‘,‘ bbbb‘ ) ;
if SQL%FOUND then
dbms_output.put_line (‘最近插入的行数:‘ || SQL%ROWCOUNT);
END if;
ROLLBACK;
END;
从这个例子可以看出,当有多条DML语句时,隐式游标只记录最近一条DML语句的执行情况。
如果是SELECT语句,情况则比较特殊。
因为当SELECT语句没有检索到满足条件的数据时,将引发NO_DATA_FOUND 异常,而当检索到多行满足条件的数据时,将引发TOO_MANY ROWS异常。
所以只有当SELECT语句正好检索到一行数据时,才可以使用隐式游标的这些属性。
如果要处理这两种特殊情况,就需要借助于显式游标。

显式游标
对于PL/SQL块中的SELECT语句,可以用显式讲标来处理。
显式游标是一个打开的工作区,
在这个工作区里保存SELECT语句的执行结果。
用显式游标可以处理返回0行、一行、多行等各种情况,并且在返回0行或多行数据这两种特殊情况下,不会引发NO_DATA_FOUND 和TOO_MANY ROWS异常。
使用游标处理SELECT语句的步骤如下:
1 )声明游标
2 )打开游标
3 )逐行取出游标中的行,并分别进行处理
4 )关闭游标
游标的工作过程如下所示。
DECLARE OPEN FETCH CLOSE
声明游标 打开游标 从游标中取数据 关闭游标
注:在从游标中取数据时,要做个判断,判断是和否取完了,如果是,则CLOSE游标;如果否,则继续FETCH游标。
游标的声明在PL/SQL块的声明部分进行。
声明的语法格式为:
DECLARE
CURSOR 游标名 IS
SELECT 语句;
例如,下面的语句声明了一个名为cur_1 的游标:
DECLARE
CURSOR cur_1 IS
SELECT * FROM emp;
由于SELECT语句的执行结果将存放在工作区中,因此不需要使用INTO子句将返回的数据赋给变量。
为了处理游标中的数据,首先要打开游标。
打开游标意味着将指定的SELECT语句交给数据库服务器执行,并将返回结果存放在工作区中。
打开游标的命令是OPEN ,其语法格式为:
OPEN 游标名
例如,打开游标cur_l 的语句为:
OPEN cur_1;
游标打开后,就可以取出游标中的数据,并对其进行处理了。
从游标中取出数据的命令是FETCH 。
FETCH命令一次取出一行数据,并将其赋给指定的变量。
FETCH命令的格式为:
FETCH 游标 INTO 变量1,变量2, ...
游标中的数据只有在取出后才能进行处理。
为此,需要在FETCH语句中用INTO子句指定多个变量,分别存放一行数据中各个列的值。
FETCH命令将一行数据中各列的值依次赋给指定的变量。
需要注意的是,变量的类型、数目要与游标中一行的各列相对应。
在用FETCH命令取出游标中的数据时,可以设想有一个指针,指向游标中的一行数据。
当游标刚刚打开时,指针指向第一行,以后每取出一行,指针自动指向下一行,直到将所有的数据都取出为止。
游标在使用完后,应该及时关闭,以释放它所占用的内存空间。
关闭游标的命令是CLOSE,其语法格式为:
CLOSE 游标名;
当游标关闭后,不能再从游标中获取数据。
如果需要,可以再次打开游标。
考虑下面的游标。
从emp表中检索员工7902 的姓名、工资、工作时间。
由于SELECT命令仅返回一行数据,所以处理的过程很简单。

时间: 2024-08-04 12:13:07

PL/SQL编程_游标的相关文章

PL/SQL编程_存储程序

在前面的部分介绍了PL/SQL块的基本编写方法. 在SQL*plus 中编写PL/SQL程序,并在SQL*plus 中执行它, PL/SQL块的代码就存放在SQL*plus的缓冲区中.如果在SQL*plus 中执行了其他的SQL语句或PL/SQL块,缓冲区中就会存放新的代码,原来的PL/SQL块就会被从缓冲区中清除出去.这种没有名称只是临时存放在缓冲区中的PL/SQL块叫做匿名块.匿名块就是没有名字的PL/SQL块,它仅存放在缓冲区中,只能在当前SQL*plus环境中执行.如果希望PL/SQL块

PL/SQL编程_子程序设计

利用PL/SQL可以进行模块化程序设计. 在一个PL/SQL块中,可以定义若干个子程序. 把一些功能相对独立.需要经常执行的代码定义为一个子程序,在需要时根据子程序的名字进行调用.这样不仅便于程序设计和编码,而且利于程序的调试.PL/SQL有两种形式的子程序,即过程和函数. 在子程序中也可以定义变量.类型.游标等,也可以进行异常处理.在调用于程序时,可以向子程序传递参数. 过程与函数的区别在于函数具有返回值,可以向调用者返回执行结果,而过程没有返回值. 如何使用过程 子程序的定义出现在PL/SQ

PL/SQL编程_概述

关于PL/SQL的内容,主要包括匿名块.存储过程和存储函数三种形式的PL/SQL块,以及在PL/SQL 中如何使用变量.类型.流控制语句.游标.触发器.异常等内容,以及如何利用PL/SQL块访问数据库中的数据. PL/SQL概述 如果说SQL是一种标准的数据库访问语言,那么PL/SQL则是Oracle公司开发的一种编程语言,它是对SQL的扩充.在PL/SQL程序中,可以定义变量.数据类型.函数以及过程,可以使用流控制语句,可以包含SQL语句,还可以进行错误处理.利用PL/SQL程序,可以对数据库

Oracle之PL/SQL编程_流程控制语句

选择语句 1. if...then 语句 语法: if < condition_expression > then plsql_sentence end if; condition_expression:表示一个条件表达式,其值为 true 时,程序会执行 if 下面的 PL/SQL 语句: 如果其值为 false,则程序会跳过if 下面的语句而 直接执行 end if 后边的语句. plsql_sentence:condition_expression 为 true 时,要执行的语句. 2.

PL/SQL编程_变量

在PL/SQL块中可以定义变量和数据类型,这使得PL/SQL块对数据的处理更加灵活. 变量和类型的定义放在PL/SQL块的变量声明部分. 变量的定义与使用 变量的定义有两种格式,分别为:变量名 类型 [约束][DEFAULT 默认值]变量名 类型[约束][:=初始值]其中用方括号限定的部分是可选的. 约束用来规定变量必须满足的条件,比如“ NOTNULL”约束指定变量不能为空值,这样在定义变量的时候就要为其指定初始值或默认值.变量名要遵守一定的命名规则. 变量名必须以字母开头,包含数字.字母.下

Oracle之PL/SQL编程_数据类型与定义变量和常量

-----------------------------------基本数据类型----------------------------------- 1.数值类型 NUMBER(P,S) 参数 P 表示精度,参数 S 表示刻度范围. 精度是指数值中所有有效数字的个数,而刻度范围是指小数点右边小数位的个数. "子类型" 是与 NUMBER 等价的类型别名. 子类型:DEC.DECIMAL.DOUBLE.INTEGER.INT.NUMERIC.SMALLINT.BINARY_INTEG

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的. 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理

pl/sql编程基础

PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 pl/sql编写能节省一点时间就是提高了性能(量大),java直接调用数据库存放的过程,解析时间就节省下来了,提高了性能 模块化的设计思想----->存储过程 网络传输(java程序中编写的sql语言),直接调用数据库的过程节省了传输量 提高安全性(存储过程避免了数据库信息的泄漏) 缺点: 移植性不

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]