定义:
游标是用来存储多条查询查询数据的一种数据结构,通过指针,从上而下移动,遍历每条数据。因为遍历的数据依次是保存到内存中,所以当数据量很大,容易造成内存不足而崩溃。
游标分为静态游标和动态游标。
7.1 静态游标
定义:在编译期间就声明定义了数据结果集,所以结果集是固定的。如果在静态游标打开后对表进行修改,则游标的结果集不会受到影响。
写法:
声明一个游标
cursor 游标名 is select 语句;
打开游标
open 游标名;
使用游标,获取游标当前的内容
fetch 游标名 into 变量;
关闭游标
close 游标名;
实例:(用while循环操作游标,打印出emp表所有员工信息)
declare
--声明一个游标
cursor mc is select * from emp;
v_user emp%rowtype;
begin
--打开游标
open mc;
--使用游标
fetch mc into v_user;
while mc%found loop
dbms_output.put_line('员工编号'||v_user.empno||'的部门号是'||v_user.deptno||'工资是'||v_user.sal);
fetch mc into v_user;
end loop;
--关闭游标
close mc;
end;
游标属性及其作用:
属性
返回值类型
作用
sql%isopen
布尔型
判断游标是否 '开启'
sql%found
布尔型
判断游标是否 '获取' 到值
sql%notfound
布尔型
判断游标是否 '没有获取' 到值(常用于 "退出循环")
sql%rowcount
整型
'当前' 成功执行的数据行数(非 "总记录数")
例:通过sql关键字来查看,本次数据修改的范围,一共有多少行。
declare
begin
delete from emp where sal>=5000;
dbms_output.put_line(sql%rowcount);
update emp set sal=2000 where sal<2000;
dbms_output.put_line(sql%rowcount);
end;
7.2 动态游标
定义: 动态游标是在运行时定义的,用于在查询结果集可能发生更改的情况下遍历结果集。如果在动态游标打开后对表进行修改,则游标的结果集会更新。
写法上与静态游标不同,需先声明游标类型,且静态游标是在声明部分定义赋值,动态游标是在代码执行部分定义赋值的。
直接举例:(用loop循环打印出emp表中部门号20的所有员工信息)
declare
--声明一个动态游标的类型 自己定义的dongtai_c和number varchar2 date是一个意思
type dongtai_c is ref cursor;
--声明游标
mc dongtai_c;
v_user emp%rowtype;
begin
--打开游标的同时,给游标赋值
open mc for select * from emp where deptno=20;
--使用loop循环读取游标
loop
fetch mc into v_user;
exit when mc%notfound;
dbms_output.put_line('员工编号'||v_user.empno||'的部门号是'||v_user.deptno||'工资是'||v_user.sal);
end loop;
--关闭游标
close mc;
end;
7.3 案例
建表语句:
CREATE TABLE EMPLOYEES (
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(50) NOT NULL,
SALARY NUMBER NOT NULL,
DEPARTMENT_ID NUMBER
);
INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID) VALUES (1, '张三', 10000, 101);
INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID) VALUES (2, '李四', 12000, 101);
INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID) VALUES (3, '王五', 11000, 102);
INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID) VALUES (4, '赵六', 9000, 103);
INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID) VALUES (5, '钱七', 13000, 101);
需求:使用游标打印出表中员工信息及工资总额。
输出结果:
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_63021300/article/details/132267190
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1324次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
794次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
725次阅读
2025-03-06 09:41:49
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
558次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
466次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
358次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
314次阅读
2025-03-26 23:27:33
Oracle分区和执行计划相关的几个问题
听见风的声音
309次阅读
2025-03-07 08:51:42
数据库管理-第299期 数据库是否需要定期重启(20250306)
胖头鱼的鱼缸
252次阅读
2025-03-06 09:09:35
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
247次阅读
2025-03-19 14:41:51