SQL程序设计—01—游标介绍
游标的使用步骤
- 定义游标
- open游标
- fetch游标赋值给变量或集合
- close游标
游标的分类:
一。静态游标
1、隐式游标
系统帮我们定义好的游标。注意一句话,每当我们执行一个dml语句,系统就会自动帮助我们创建隐式游标。
例如,将孙丽的电话号码修改为 13818882888。
BEGIN UPDATE PERSON.PERSON SET PHONE=13818882888 WHERE NAME='孙丽'; IF SQL%NOTFOUND THEN PRINT '此人不存在'; ELSE PRINT '已修改'; END IF; END; /
2、显式游标
我们自己定义的游标。
--静态显式游标: declare c1 cursor is select * from test; v_id int default 0; v_name varchar(50) DEFAULT null; begin open c1; repeat fetch next c1 into v_id, v_name; dbms_output.put(v_id); dbms_output.put(v_name); until c1%notfound; close c1; end;
--静态显式游标: declare c1 cursor return sysdba.test%rowtype is select * from sysdba.test; --这个游标在定义的时候指定了返回值类型必须是sysdba.test%rowtype v_test sysdba.test%rowtype; --这里定义了一个变量,变量的数据类型式sysdba.test%rowtype; begin open c1; repeat fetch next c1 into v_test; --游标从查询表达式select * from test取出来的值,是和v_test的数据类型一致的,所以可以赋值给v_test print v_test.id;
print v_test.name; until c1%notfound; close c1; end;
二。动态游标
区别不大,就两点区别,分别在定义游标和打开游标上。
定义游标时:不要接相关的查询表达式赋值给游标
open游标时:要接相关的查询表达式赋值给游标,并支持动态参数绑定。
三。游标变量
将游标作为一个变量,这里的游标是一个变量,什么意思呢?就是说他可以指向不同的查询表达式的内存区域地址(当时相同时间下是只能指向一个的)
游标变量和游标的区别主要是1.定义语法不同 2.open游标时才给游标赋值,如红色所示:
--游标变量: declare type c1_cursor_type is ref cursor return sysdba.test%rowtype; c1 c1_cursor_type; v_test sysdba.test%rowtype; begin open c1 for select * from test; repeat fetch next c1 into v_test; dbms_output.put(v_test); until c1%notfound; close c1; end;
--游标变量: declare type test_record is record(id test.id%TYPE, name test.name%TYPE); v_test test_record; type c1_cursor_type is ref cursor return test_record; c1 c1_cursor_type; begin open c1 for select * from test; repeat fetch next c1 into v_test; print v_test.ID; until c1%notfound; close c1; end;
%type和%rowtype学习可以参考这篇博客:
https://blog.csdn.net/yuzongtao/article/details/40708739
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!