前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PL/SQL学习笔记-游标

PL/SQL学习笔记-游标

作者头像
liulun
发布2022-05-09 11:06:18
1640
发布2022-05-09 11:06:18
举报
文章被收录于专栏:liulun

一:普通游标

代码语言:javascript
复制
declare
--定义record类型变量
type v_record is record
(title labor.xland.title%type,state labor.xland.title%type);
--定义字符串类型变量
v_title labor.xland.title%type;
--定义一个游标
cursor c1 is
select title from labor.xland;
begin 
open c1;--打开游标
loop
fetch c1 into v_title;--把游标中的数据存入变量,可以有多个变量
if c1%found then--如果找到数据,找不到数据为notfound
  dbms_output.put_line(v_title);
else
  dbms_output.put_line('已经处理完结果集');
  exit;--退出循环
end if;
end loop;
close c1;--关闭游标
end;

输出结果

代码语言:javascript
复制
new xland
123
xland
123
xland
已经处理完结果集

二:有参游标

代码语言:javascript
复制
declare
--定义record类型变量
type v_record is record
(title labor.xland.title%type,state labor.xland.title%type);
--定义字符串类型变量
v_title labor.xland.title%type;
--定义有参数的游标
cursor c1(v_no number) is
select title from labor.xland where state > v_no;
begin 
open c1(0);--打开游标,传递参数
loop
fetch c1 into v_title;--把游标中的数据存入变量,可以有多个变量
if c1%found then--如果找到数据,找不到数据为notfound
  dbms_output.put_line(v_title);
else
  dbms_output.put_line('已经处理完结果集');
  exit;--退出循环
end if;
end loop;
close c1;--关闭游标
end;

输出结果

代码语言:javascript
复制
123
xland
123
xland
已经处理完结果集

三:有返回值的游标

代码语言:javascript
复制
declare
--定义一个类型
type t_record is record
(title labor.xland.title%type,state labor.xland.state%type);
--定义v_record类型的变量
v_record t_record;
--定义字符串类型变量
v_title labor.xland.title%type;
--定义有返回值的游标
cursor c1(v_no number) return t_record is
select title,state from labor.xland where state > v_no;
begin 
open c1(v_no => 0);--打开游标,传递参数(参数的另一种传递方式)
loop
fetch c1 into v_record;--把游标中的数据存入变量,可以有多个变量
exit when c1%notfound;
  dbms_output.put_line(v_record.title||'  '||to_char(v_record.state));
end loop;
close c1;--关闭游标
end;

输出结果

代码语言:javascript
复制
123  3
xland  3
123  3
xland  3

四:运行过程中获取游标中的内容

代码语言:javascript
复制
declare
--定义游标
cursor c1(v_no number) is
select * from labor.xland where state > v_no;
--定义变量为游标的行类型
代码语言:javascript
复制
v_record c1%rowtype;
begin 
open c1(v_no => 0);--打开游标,传递参数(参数的另一种传递方式)
loop
fetch c1 into v_record;--把游标中的数据存入变量,可以有多个变量
exit when c1%notfound;
  dbms_output.put_line(v_record.title||'  '||to_char(v_record.state));
end loop;
close c1;--关闭游标
end;

输出结果

代码语言:javascript
复制
123  3
xland  3
123  3
xland  3

五:隐式游标

代码语言:javascript
复制
declare
v_rows number;
begin 
update labor.xland set xland.title = 'new xland' where xland.state>0;
v_rows := sql%rowcount;
dbms_output.put_line(to_char(v_rows));
end;

更多隐式游标属性请看此系列文章的附录: 常用函数 输出结果为受影响的行数 不能对隐式游标执行显示游标类似的操作,如: open  fetch close等 六:用for循环简化游标的操作

代码语言:javascript
复制
declare
--定义游标
cursor c1(v_no number default 0) is--默认值为0
select * from labor.xland where state > v_no;
--定义变量为游标的行类型
v_record c1%rowtype;
begin 
for v_record in c1() loop
  dbms_output.put_line(v_record.title||'  '||to_char(v_record.state));
end loop;
end;

输出结果

代码语言:javascript
复制
new xland  3
new xland  3
new xland  3
new xland  3

注意此游标的参数有个默认值 for循环使得我们的程序不必再写 open  fetch  close等操作了 它已经给我们实现了 七:在游标中更新或删除数据

代码语言:javascript
复制
declare
--定义游标
cursor c1(v_no number) is
select * from labor.xland where state > v_no for update;--注意最后的for update
--定义变量为游标的行类型
v_record c1%rowtype;
begin 
open c1(v_no => 0);--打开游标,传递参数(参数的另一种传递方式)
loop
fetch c1 into v_record;--把游标中的数据存入变量,可以有多个变量
exit when c1%notfound;
if v_record.state=3 then
   update xland set state = 6 where current of c1;--注意where子句
  dbms_output.put_line('更新了一条数据');
end if;
end loop;
commit;--提交更新
close c1;--关闭游标
end;

当使用for update打开游标后就可以用current of cursor_name来更新数据了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档