Oracle数据库学习笔记(七 —— 游标)
2023-04-18 14:58:46 时间
Oracle 数据库游标
一、游标
- SQL语言是面向集合的,是对指定列的操作。如果要对列中的指定行进行操作,就必须使用游标。
- 当在PL/SQL块中执行查询语句(SELECT)和数据操纵语句(DML)时,Oracle会为其分配一个上下文区(Context Area)
- 游标是指向上下文区的指针,它为应用提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法
1.1 游标(显示游标)
游标分为显式游标和隐含游标两种
- 隐含游标用于处理 SELECT INTO和DML语句
- 显式游标则用于处理SELECT语句返回的多行数据
1.1.1 使用显示游标
-- 定义游标
CURSOR cursor_name IS select_statement;
-- 打开游标
OPEN cursor_name;
-- 提取数据
FETCH cursor_name INTO variable1,variable2,...;
FETCH cursor_name bulk collect into collect1…;
-- 关闭游标
CLOSE cursor_name;
1.1.2 显示游标属性
- 显式游标属性用于返回显式游标的执行信息
- 游标属性使用格式为:游标名 + 属性名
- %ISOPEN
- 用于确定游标是否已经打开。如果游标已经打开,则返回值为TRUE;否则返回FALSE
- %FOUND
- 检查是否从结果集中提取到数据。如果提取到数据,则返回值为TRUE;否则返回FALSE
- %NOTFOUND
- 与%FOUND属性恰好相反,如果提取到数据,则返回值为FALSE;否则返回TRUE
- %ROWCOUNT
- 返回到当前行为止已经提取到的实际行数
注意:
- 显示游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行
- 显示游标的操作过程
数据库 ——> (打开游标)——> 得到数据库的内容 ——> 提取行(得到变量)——> 关闭游标
示例:
declare
type v_dept is table of dept%rowtype index by binary_integer;
cursor dept_cursor is select * from dept;
v_dept_table v_dept;
begin
open dept_cursor; -- 将游标中的数据一次性提取到表结构中
fetch dept_cursor bulk collect into v_dept_table;
close dept_cursor;
for i in v_dept_table.first..v_dept_table.last loop
dbms_output.put_line(v_dept_table(i).deptno||'
'||v_dept_table(i).dname||' '||v_dept_table(i).loc);
end loop;
end;
1.1.3 游标 (参数游标)
- 带有参数的游标
- 在定义了参数游标之后,当使用了不同参数值多次打开游标时,可以生成不同的结果集
语法:
-- 创建一个带参数的游标
CURSOR cursor_name(param_name datatype) -- 定义参数游标时,游标参数只能指定数据类型,而不能指定长度。
IS select_statement;
-- 查询指定部门的员工信息
declare
cursor emp_cursor(param_dept number) is -- 定义游标参数名及类型
select empno,ename from emp where deptno=param_dept; -- 参数作为条件
emp_record emp_cursor%rowtype; -- 定义游标集合相同的数据结构
begin
open emp_cursor(20); -- 打开游标并传参
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line(emp_record.empno||' '||emp_record.ename);
end loop;
close emp_cursor;
end;
1.1.4 游标 (游标 for 循环)
游标for循环简化游标处理
- 使用游标for循环时,oracle隐含打开游标,提取数据并关闭游标。
示例:
declare
cursor dept_cursor is select * from dept;
begin
for dept_row in dept_cursor loop -- for 循环迭代游标数据
dbms_output.put_line('第'||dept_cursor%rowcount|| -- 游标迭代的次数
'个部门:'||dept_row.dname);
end loop;
end;
游标for循环简化游标处理
- 当使用游标for循环时,可以直接使用子查询。 示例:
-- 获取每个部门的名称
begin
for dept_row in(select deptno,dname from dept) loop
dbms_output.put_line('第'||dept_dept.deptno||
'个部门:'||dept_row.dname);
end loop;
end;
1.1.5 游标(游标变量)
- 使用显式游标时,需要在定义部分指定其所对应的静态SELECT语句
- 使用游标变量时,开发人员可以在打开游标变量时指定其所对应的SELECT语句
语法:
TYPE ref_type_name IS REF CURSOR;
cursor_variable ref_type_name;
-- 游标变量示例
-- 显示部门编号为 10 的所有雇员姓名
declare
type emp_cursor_type is ref cursor; -- 定义游标变量 cursor 是游标的关键字
emp_cursor emp_cursor_type;
v_emp_row emp%rowtype;
begin
open emp_cursor for select * from emp where deptno=10; -- 打开游标时用 for 定义游标内容
loop
fetch emp_cursor into v_emp_row;
exit when emp_cursor%notfound;
dbms_output.put_line('第'||emp_cursor%rowcount|| -- 用游标变量获取已经循环的行数
'个员工:'||v_emp_row.ename);
end loop;
close emp_cursor;
end;
1.1.6 游标 (隐含游标)
当执行一条DML语句或者SELECT…INTO语句时,都会创建一个隐含游标 隐含游标的名称是SQL,不能对SQL
- 游标显式执行OPEN、FETCH和CLOSE语句。
- Oracle隐式地打开、提取,并总是自动地关闭SQL游标 隐式游标属性包括
- SQL%FOUND、
- SQL%NOTFOUND
- SQL%ROWCOUNT
- SQL%ISOPEN
declare
v_empno number(4):=7369;
begin
delete from emp where empno=v_empno;
if sql%found then
dbms_output.put_line('存在该员工!');
else
dbms_output.put_line('不存在该员工!');
end if;
end;
1.2 总结
定义游标
CURSOR cursor_name IS select_statement;
打开游标
OPEN cursor_name;
提取数据
FETCH cursor_name INTO variable1,variable2,...;
关闭游标
CLOSE cursor_name;
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!