「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
游标 ( Cursor )
什么是游标?
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。
游标的类型
游标的三种类型:隐式Cursor,显式Cursor,Ref Cursor(动态Cursor) 。
游标的优缺点
(1) 提高 sql '执行效率'
(2) 牺牲 '内存'
游标的四个属性
| 属性 | 返回值类型 | 作用 |
|---|---|---|
| sql%isopen | 布尔型 | 判断游标是否 '开启' |
| sql%found | 布尔型 | 判断游标是否 '获取' 到值 |
| sql%notfound | 布尔型 | 判断游标是否 '没有获取' 到值(常用于 "退出循环") |
| sql%rowcount | 整型 | '当前' 成功执行的数据行数(非 "总记录数") |
1. 隐式Cursor
隐式Cursor是系统自动打开和关闭Cursor。
可以通过隐式Cusor的属性来了解DML操作的状态和结果(行数和是否成功),从而达到流程的控制。
隐式和显式Cursor都具有的属性:
- SQL%ROWCOUNT 整型,代表DML语句成功执行的数据行数
- SQL%FOUND 布尔型,值为TRUE代表操作成功
- SQL%NOTFOUND 布尔型,与SQL%FOUND相反
- SQL%ISOPEN 布尔型,DML执行过程中为真,结束后为假
示例:
declare
begin
update student set remark = null;
--输出操作成功的条数
dbms_output.put_line( SQL%rowcount );
--判断操作是否成功
if SQL%FOUND then
dbms_output.put_line('success');
else
dbms_output.put_line('failed' );
end if;
--判断游标是否打开(是否正在执行中)
if SQL%ISOPEN then
dbms_output.put_line('running');
else
dbms_output.put_line('done' );
end if;
end;
2. 静态 Cursor
从数据库中提取多行数据,使用显式Cursor
显式游标的运用分为四个步骤:
- 定义游标---Cursor [Cursor Name] IS; 必须要使用is.
- 打开游标---Open [Cursor Name];
- 操作数据---Fetch [Cursor name] into 行对象;
- 关闭游标---Close [Cursor Name],这个步骤绝对不可以遗漏
示例1 单行游标:
declare
cursor student_c is select * from student where id = 1;
rs student%rowType;
begin
open student_c;
fetch student_c into rs;
dbms_output.put_line(rs.id || ' ' || rs.name);
close student_c;
end;
示例2 多行游标:
declare
cursor student_c is select * from student order by id;
begin
--无需打开和关闭,自动打开和关闭
for rs in student_c loop
dbms_output.put_line(rs.id || ' ' || rs.name);
end loop;
end;