概述
游标的概念:
用来存储多条查询数据的一种数据结构(‘结果集’),
它有一个 ‘指针’,从上往下移动(‘fetch’),从而能够 ‘遍历每条记录’
2. 优缺点
(1) 提高 sql ‘执行效率’
(2) 牺牲 ‘内存’
概念图
游标的类型:
隐式游标
显式游标
REF游标
语法
基本写法
1、声明游标
2、开启游标
3、获取数据
4、关闭游标
示例
declare
--声明显式游标并初始化
cursor emp_cur is select * from emp e where e.employee_id=&部门编号 ;
--声明变量类型接收一行数据
emp_row emp%rowtype;
begin
open emp_cur;
loop
--逐行读取游标赋值给变量
fetch emp_cur into emp_row;
--当游标中没有记录时退出循环
exit when emp_cur%notfound;
dbms_output.put_line('员工编号:'||emp_row.employee_id||'工资:'||emp_row.salary);
end loop;
--关闭游标
close emp_cur;
end;
游标4大属性
sql%isopen 判断游标是否 '开启'
sql%found 判断游标是否 '获取' 到值
sql%notfound 判断游标是否 '没有获取' 到值(常用于 "退出循环")
sql%rowcount '当前' 成功执行的数据行数(非 "总记录数")
分类
隐式游标
-
在PL/SQL中使用DML语句时自动创建隐式游标
-
隐式游标自动声明、打开和关闭,其名为 SQL
-
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
-
隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE %NOTFOUND – SQL 语句没有影响任何行时为TRUE %ROWCOUNT – SQL 语句影响的行数 %ISOPEN - 游标是否打开,始终为FALSE
--隐式游标统一名称sql,常用属性%found、%notfound、%rowcount,%isopen
declare
begin
delete from student s where s.id between 1 and 100;
--上面的DML语句是否有影响是数据,sql%found跟sql%notfound干好相反
if sql%found then
dbms_output.put_line('成功删除数据行:'||sql%rowcount);
else
dbms_output.put_line('没有找到对应记录');
end if;
if sql%isopen then--隐式游标永远是关闭状态
dbms_output.put_line('当前游标打开'