暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle游标

芃芃 3天前
9


定义:

游标是用来存储多条查询查询数据的一种数据结构,通过指针,从上而下移动,遍历每条数据。因为遍历的数据依次是保存到内存中,所以当数据量很大,容易造成内存不足而崩溃。

游标分为静态游标和动态游标。

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论