#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();
#因为是新建的游标,数据都是从头开始读的
#第一次读会读到第一条数据
我们代码中,是第一次就关闭游标,
在调用创建的还是新游标
解决办法
游标
最新推荐文章于 2021-08-06 16:08:47 发布