1、概念
游标:从字面来理解就是游动的光标。用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。
2、分类
2.1、静态游标:显式游标、隐式游标
2.2、动态游标:强类型(限制)、弱类型(非限制)
3、属性
3.1、%ISOPEN 判断游标是否被打开,若打开,则%ISOPEN等于TRUE;否则等于FALSE。
3.2、%FOUND 判断游标所在行是否有效。若有效,则%FOUND等于TRUE;否则等于FALSE。
3.3、%NOTFOUND 与%FOUND相似,功能相反。
3.4、%ROWCOUNT 返回到当前位置为止,游标所读取的记录行数。
4、详细说明
4.1、显式游标:
Cursor 游标名(参数) [返回值类型] Is Select语句
OPEN 游标名(参数)
FETCH 游标名(参数) INTO 变量
CLOSE 游标名(参数)
4.2、隐式游标:
select **** into **** from **** where ****
for var_name in (select ****)
loop
end loop
for var_name in (游标名(参数))
loop
end loop
4.3、动态游标
动态游标,在运行的时候才能确定游标使用的查询。分类:
1.强类型(限制)REF CURSOR,规定返回类型
2.弱类型(非限制)REF CURSOR,不规定返回类型,可以获取任何结果集。
5、举例:
5.1、静态显式游标
1 set serveroutput on; 2 declare 3 r_d2tlog d2t_Log%rowtype; 4 cursor cs_d2tlog is select * from d2t_log; 5 begin 6 open cs_d2tlog; 7 loop 8 fetch cs_d2tlog into r_d2tlog; 9 exit when cs_d2tlog%notfound; 10 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||cs_d2tlog%rowcount); 11 end loop; 12 close cs_d2tlog; 13 end; 14 /
5.2、动态弱类型游标
1 declare 2 r_d2tlog d2t_Log%rowtype; 3 type d2tlog is ref cursor; 4 t_d2tlog d2tlog; 5 begin 6 open t_d2tlog for select * from d2t_log; 7 loop 8 fetch t_d2tlog into r_d2tlog; 9 exit when t_d2tlog%notfound; 10 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||t_d2tlog%rowcount); 11 end loop; 12 close t_d2tlog; 13 end; 14 /
5.3、动态强类型游标
1 declare 2 l_sqlstr varchar2(100); 3 type t_d2tlog is record( 4 activeid number(30), 5 writedate date 6 ); 7 type c_d2tlog is ref cursor return t_d2tlog; 8 st_d2tlog t_d2tlog; 9 sc_d2tlog c_d2tlog; 10 begin 11 open sc_d2tlog for select activeid,writedate from d2t_log; 12 loop 13 fetch sc_d2tlog into st_d2tlog; 14 exit when sc_d2tlog%notfound; 15 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount); 16 end loop; 17 close sc_d2tlog; 18 19 open sc_d2tlog for select activeid,writedate from d2t_log where activeid=130208; 20 loop 21 fetch sc_d2tlog into st_d2tlog; 22 exit when sc_d2tlog%notfound; 23 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount); 24 end loop; 25 close sc_d2tlog; 26 27 /* 28 l_sqlstr:='select activeid,writedate from d2t_log where activeid=124531'; 29 open sc_d2tlog for l_sqlstr; 30 loop 31 fetch sc_d2tlog into st_d2tlog; 32 exit when sc_d2tlog%notfound; 33 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount); 34 end loop; 35 close sc_d2tlog; 36 */ 37 end; 38 /
5.4、动态强类型游标
1 declare 2 r_d2tlog d2t_log%rowtype; 3 type cursor1 is ref cursor; 4 type cursor2 is ref cursor return d2t_log%rowtype; 5 6 cs_cursor2 cursor2; 7 begin 8 dbms_output.put_line('dynamic cursor define ok'); 9 10 open cs_cursor2 for select * from d2t_log; 11 loop 12 fetch cs_cursor2 into r_d2tlog; 13 exit when cs_cursor2%notfound; 14 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||cs_cursor2%rowcount); 15 end loop; 16 close cs_cursor2; 17 end; 18 /
5.5、游标定义
1 declare 2 r_d2tlog d2t_log%rowtype; 3 type cursor1 is ref cursor; 4 type cursor2 is ref cursor return r_d2tlog; 5 begin 6 dbms_output.put_line('dynamic cursor define error'); 7 end; 8 /
程序员的基础教程:菜鸟程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2015-12-05 中文转换为完整拼音算法原理分析