游标

#java:变量、数组、循环、选择
#数组:1、存储数据
       2、可以通过下标对数组的每一个元素


数据库里面  视图、表、触发器也好
都是对某个结果进行整体操作
需求:希望数据库也有一个类似于指南的,
对结果集,进行逐行的操作处理。
实现面向数据进行操作,而不是常规的面向结果集进行操作
游标——cursor
游标是一种处理数据的方式,可从结果集中,定位到单独某一行,进行查询或操作
定位到单独某一行,进行查询或操作
类似于java数组的下标,从数组中一个一个的读取数据
游标可以从结果集中一行一行的读取数据
下标是那个数组的  又表示哪个查询结果集的


一、声明游标
declare 游标名 cursor
for select 字段1,字段2  from 表名...;

注意:
1、字段:需要查询哪些写那些,不能多不能少

二、打开游标
open 游标;

三、查询结果
  fetch 游标名 into 字段1,字段2;

注意:
  1、将结果集中的指定字段的数据 赋值给定义的变量。
  2、变量顺序要和字段对应

四、关闭游标
close 游标名

游标的概念:
1、是只读、不能更新
2、滚动,只有一个方向进行操作

游标的四个步骤
1、声明创建游标
2、打开游标
3、获取游标结果
4、关闭游标



游标创建四步走:声明、打开、读取、关闭


#给员工表创建游标,检索员工姓名
#创建存储过程

create procedure pro_getName()
begin
#0、创建变量接受员工姓名
declare e_name varchar(20);
#第一步、声明游标
declare c_getName cursor
for select ename from myemp;#字段是要什么写什么
#第二步、打开游标
open c_getName;
#第三步、读取数据 存入变量中

fetch c_getName into e_name;

#输出读取到的数据
select e_name;

#第四步、关闭游标
close c_getName;

end

三个循环: while 先判断后执行  repeat 先执行后判断  loop死循环

#调用
call pro_getNameLoop();

#No date - zero  rows fetched,selected, or peocessed
#在游标中,如果数据已经读取完成,目前是loop死循环
#无法结束循环,只能通过报错来结束循环
#没有值了,需要结束循环

#需求,自己判断有没有值了,手动结束循环

create procedure pro_getName3()
begin
#0、创建变量接受员工姓名
declare e_name varchar(20);
#声明变量,用于指定是否结束循环 默认false 不结束
declare flag int default false;
#第一步、声明游标
declare c_getName cursor
for select ename from myemp;#字段是要什么写什么

########################
#如果游标读取不到值,设置flag 变量为ture
#表示可以结束循环
#指定游标可以结束循环的返回值
declare continue handler for not foud set flag = true;
########################

#第二步、打开游标
open c_getName;
#第三步、读取数据 存入变量中 + 循环

lp:loop;#循环开始
#flag  true 表示可以结束循环
  if flag then
#结束循环
end if;
fetch c_getName into e_name;

#输出读取到的数据
select e_name;

#第四步、关闭游标
end loop lp;#循环结束
close c_getName;

end

call pro_getName3();


#创建游标,结合循环,修改员工工资,总裁+5000 经理+2000 组长+1000 员工+500
create procedure pro_zhengxin()
begin
#0、声明要接受值变量 工号、目前薪资
declare e_id int;#工号
declare e_sal int; #目前薪资
declare e_position varchar(20);#职位

#结束循环变量 默认不关闭
declare flag int default false;

#1、声明游标

declare c_zhangxin cursor
for select id,esalary,eposition from myemp;

#设置结束循环变量 = true

declare continue handler for not found set flag = true;

#2、打开游标

open c_zhangxin;

#3、循环
lp:loop
  #先判断
  if flag then #没有值
    #结束
    leave lp;
  end if;
#4、查询每一个,并判断职位,进行修改
  #有值 获取对应的值
  fetch c_zhangxin into e_id,e_sal,e_postition;
  #判断
  if e_position = '总裁' then
    set e_sal = e_sal + 5000;
  elseif e_position = '经理' then
    set e_sal = e_sal + 2000;
  elseif e_position = '组长' then
    set e_sal = e_sal + 1000;
  elseif e_position = '员工' then
    set e_sal = e_sal + 500;
  end if;
  update myemp set esalary = e_sal where id = e_id;
end loop lp;



#5、关闭游标
clsose c_zhangxin;	

end

call pro_zhangxin();









#调用存存储过程测试效果
call pro_getName();

#因为是新建的游标,数据都是从头开始读的
#第一次读会读到第一条数据
我们代码中,是第一次就关闭游标,
在调用创建的还是新游标

解决办法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值