【MySQL】存储过程 —— 游标 —— cursor

一、介绍

游标(CURSOR)是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下。

A. 声明游标

声明游标和声明变量类似,只不过游标对应的数据类型叫CURSOR

DECLARE 游标名称 CURSOR FOR 查询语句; -- 你需要将哪个SQL语句的查询结果封装到这个游标中呢?

B. 打开游标

OPEN 游标名称;

C. 获取游标记录

FETCH 游标名称 INTO 变量 [, 变量  ]; -- 把游标中的记录赋值给一个一个的变量(into)

D. 关闭游标

CLOSE 游标名称;

二、案例

根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名 (name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表 (id,name,profession)中。

-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游标
create procedure p11(in uage int)
begin
  -- 后面SQL语句查询出来的结果集就会存储在u_cursor游标中
  declare u_cursor cursor for select name,profession from tb_user where age <= uage;
  declare uname varchar(100);
  declare upro varchar(100);
  drop table if exists tb_user_pro;
  create table if not exists tb_user_pro(
    id int primary key auto_increment,
    name varchar(100),
    profession varchar(100)
  );
  open u_cursor;
  while true do
    fetch u_cursor into uname,upro;
    insert into tb_user_pro values (null, uname, upro); -- id自增,这里直接给null即可
  end while;
  close u_cursor;
end;

call p11(30);

上述的存储过程,最终我们在调用的过程中,会报错:变量或条件的声明应该在游标之后。

image-20240720133525489

简单说:游标的声明和普通变量的声明,它们是有先后顺序的,要先声明普通变量,再声明游标

declare uname varchar(100);
declare upro varchar(100);
-- 后面SQL语句查询出来的结果集就会存储在u_cursor游标中
declare u_cursor cursor for select name,profession from tb_user where age <= uage;

重新执行该SQL,仍然会报错,之所以报错是因为上面的while循环中,并没有退出条件。当游标的数据集获取完毕之后,再次获取数据,就会报错,从而终止了程序的执行。

image-20240720121648290

但是此时,tb_user_pro表结构及其数据都已经插入成功了,我们可以直接刷新表结构,检查表结构 中的数据。

image-20240720121708348

上述的功能,虽然我们实现了,但是逻辑并不完善,而且程序执行完毕,获取不到数据,数据库还报错。 接下来,我们就需要来完成这个存储过程,并且解决这个问题。

要想解决这个问题,就需要通过MySQL中提供的 条件处理程序 Handler 来解决。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值