PL/SQL之游标的使用

1## PL/SQL之游标的使用

一 游标概念

游标是一个 指向上下文的句柄 ( 或指针 。通过游标, PL/SQL 可以控制上下文区和处理语句时上下文区会发生些什么事情。
对于不同的 SQL 语句,游标的使用情况不同:
在这里插入图片描述
1 处理显式游标
(1)显示游标处理
① 定义游标 就是定义一个游标名,以及与其相对应的 SELECT 语句,定义的游标不能有into子句。
格式

CURSOR cursor_name[(parameter[, par ameter])] IS select_statement;
游标参数只能为输入参数,其格式为:
parameter_name [IN] datatype [{
    
    := | DEFAULT} expression]

② 打开游标
就是执行游标所对应的 SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有 FOR UPDATE 选项, OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。
格式
在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。 PL/SQL程序不能用 OPEN 语句重复打开一个游标。

OPEN cursor_name[([parameter =>] value[, [parameter =>] value])];

③ 提取游标数据
就是检索结果集合中的数据行,放入指定的输出变量中。
格式

FETCH cursor_name INTO {
    
    variable_list | record_variable

④ 对记录进行处理,直到活动集合中没有记录
⑤ 关闭游标
当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,
并使该游标的工作区变成无效,不能再使用 FETCH 语句取其中数据。关闭后的游标可以使用 OPEN 语句重新打开。
格式

CLOSE cursor_name;

2 游标属性
在这里插入图片描述
案例如下:
例题1:查询前10名的员工信息
在这里插入图片描述
例题2:游标参数的传递方法
在这里插入图片描述

在这里插入图片描述
案例3:给工资低于3000的员工工资调为3000
在这里插入图片描述
3 游标的for循环
PL/SQL 语言提供了 游标 FOR 循环语句,自动执行游标的 OPEN 、 FETCH 、 CLOSE 语句和 循环 语句的功能;当进入循环时,游标 FOR 循环语句 自动 打开游标,并提取第一行游标数据,当程序处理完 当前所提取的数据而进入下一次循环时,游标 FOR 循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标 。
格式

FOR index_variable IN cursor_name[value[, value]] LOOP
	--游标数据处理代码
END LOOP;

index_variable 为游标 FOR 循环语句隐含声明的索引变量,该变量为 记录变量 ,其 结构与游标查询语句返回的结构集合的结构相同 。在程序中可以通过引用该索引记录变量元素来读取所提取的 游标数,index_variable 中各元素的名称与游标查询语句选择列表中所制定的列名相同。 如果在游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名后才能通过游标 FOR 循环语句中的索引变量来访问这些列数据 。
注:不要在程序中对游标进行人工操作;不要在程序中定义用于控制
FOR 循环的记录。
案例1:
在这里插入图片描述
案例2:当所声明的游标带有参数时,通过游标 FOR 循环语句为游标传递参数。
在这里插入图片描述

在这里插入图片描述
案例3:PL/SQL 还允许在游标 FOR 循环语句中使用子查询来实现游标的功能。
在这里插入图片描述
2 处理隐式游标
(1)显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些 由系统隐含创建
的游标称为隐式游标 隐式游标的名字为 SQL
,这是由 ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE 系统自动地完成,无需用户进行处理。 用户只能通过隐式游标的相关属性,来完成相应的操作 。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一 条 SQL 语句所包含的数据。
格式调用为:SQL%
属性:
在这里插入图片描述
(2)案例
更新 指定员工信息,如果该 员工 没有找到 ,则 打印 查无此人 信息 。
在这里插入图片描述
(3)关于 NO_DATA_FOUND 和 %NOTFOUND 的区别
SELECT … INTO语句触发 NO_DATA_FOUND
当一个显式游标的WHERE 子句未找到时触发 %NOTFOUND
当UPDATE 或 DELETE 语句的 WHERE 子句未找到时触发 SQL%NOTFOUND ;在提取循环中要用 %NOTFOUND
或 %FOUND 来确定循环的退出条件,不要用 NO_DATA_FOUND.
(4)游标的修改和删除操作
游标修改和删除操作是指在游标定位下,修改或删除表中指定的数据行。这时, 要求游标 查询语句中必须使用 FOR UPDATE 选项 ,以便在打开游标时锁定游标结果集合在表中对应数据行的所有列和部分列。
为了对正在处理查询 的行不被另外的用户改动, ORACLE 提供一个 FOR UPDATE 子句来对所选择的行进行锁住 。该需求迫使 ORACLE 锁定游标结果集合的行,可以防止其他事务处理更新或删除相同的行,直到您的事务处理提交或回退为止。
语法

SELECT . . . FROM … FOR UPDATE [OF column[, column]] [NOWAIT]
如果另一个会话已 对活动集中的行加了锁,那么 SELECT FOR UPDATE 操作一直等待到其它的会话释放这些锁后才继续自己的操作,对于这种情况,当加上 NOWAIT 子句时,如果这些行真的被另一个会话锁定,则 OPEN 立即返回并给出:

ORA0054 resource busy and acquire with nowait specified.
如果使用 FOR UPDATE 声明游标,则可在 DELETE 和 UPDATE 语句中使用 WHERE CURRENT OFcursor_name 子句,修改或删除游标结果 集合当前行对应的数据库表中的数据行 。
案例如下:
从 EMP LOYEE S 表中查询某部门的员工情况,将其工资最低定为 3000
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hcyxsh/article/details/114981864