plsql 显式游标

显式游标的处理过程包括:

声明游标,打开游标,检索游标,关闭游标。

声明游标

CURSOR c_cursor_name IS statement;

游标相当于一个查询结果集,将查询的结果放在游标里,方便在块里进行处理。

记录

一个记录就是一个复合的数据结构,相当于结果集里的一行数据,用于遍历游标时存放结果。记录支持三种定义:基于表,基于游标,自定义。

如果是基于表或游标,其定义格式为:

record_name table_name or cursor_name%ROWTYPE;

打开游标

OPEN cursor_name;

检索游标

存在两种游标检索方式:

FETCH cursor_name INTO pl/sql variables;

or

FETCH cursor_name INTO pl/sql record;

当游标被检索时,在每个FETCH语句之后,活跃数据集指针继续迁移到下一个数据行。因此,FETCH会返回活跃数据集中连续的数据行,直到获取整个数据集。最后一个FETCH语句不会给输出变量赋值,后者仍旧保存原来的值。

那么在游标检索到最后,如何停止检索呢?

这时就要用到游标的属性了。

游标属性包括:

%NOTFOUND 当前的FETCH操作没有返回数据行时,为true,否则为false;

%FOUND       与上述相反;

%ROWCOUNT 返回游标的记录数量;

%ISOPEN     检测游标是否打开;

关闭游标

CLOSE cursor_name;

以下是一个示例:

复制代码
 1 declare
 2   cursor c_zip is 
 3          select * from zipcode;--声明游标
 4   vr_zip c_zip%rowtype;--声明记录,结构基于游标
 5 begin
 6   open c_zip;--打开游标
 7   loop
 8     fetch c_zip into vr_zip;--循环,检索游标
 9     exit when c_zip%NOTFOUND;--利用属性,当前一FETCH操作没有返回数据,exit
10     dbms_output.putline(vr_zip.zip || ' ' || vr_zip.city || ' ' || vr_zip.state);
11   end loop;
12   close c_zip;--关闭游标
13 end;
复制代码

 

简便的办法:使用游标 FOR循环

借助于游标FOR循环,游标打开,检索和关闭的过程都被隐含地实现。这使得代码块更容易编写与维护。

使用方法其实与C#中的foreach相似,自动遍历。

以下是上面示例的for循环写法:

复制代码
1 declare
2   cursor c_zip is 
3          select * from zipcode;--声明游标
4 begin
5   for r_zip in c_zip--不必声明记录
6   loop
7     dbms_output.putline(vr_zip.zip || ' ' || vr_zip.city || ' ' || vr_zip.state);
8   end loop;--不必考虑何时退出
9 end;
复制代码

 

传入参数

如果要传入参数,在游标名后面加上类似函数的参数列表之类的东西,在检索游标时相当于调用(即FETCH INTO语句),在游标名后面传入实际参数。

下面是一个示例:

复制代码
 1 declare
 2   cursor c_zip(p_state in zipcode.state%type) is --传入参数
 3          select zip, city, state
 4          from zipcode
 5          where state = p_state;
 6   v_state zipcode.state%type := &a;
 7 begin
 8   for r_zip in c_zip(v_state)--调用时传入实际参数
 9       loop
10             dbms_output.put_line(r_zip.zip || ', ' || r_zip.city || ', ' || r_zip.state);
11       end loop;
12 exception
13    when no_data_found then dbms_output.put_line('no data found');
14 end;
复制代码

 

七夕节快乐!大家要做好安全措施哦~~

posted @   kingsleylam  阅读(3050)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示