mysql数据库存储过程之游标(光标cursor)详解

 更新时间:2023年07月06日 09:40:02   作者:晚安果汁  
这篇文章主要介绍了mysql数据库存储过程之游标(光标cursor)详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql存储过程之游标(光标cursor)

游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。

游标的使用包括游标的声明、open、fetch和close。

一、语法

#声明游标
declare 游标名称 cursor for 查询语句;
#开启游标
open 游标名称;
#获取游标记录
fetch 游标名称 into 变量[,变量];
#关闭游标
close 游标名称;

二、案例

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

逻辑

#A.声明游标,存储查询结果集

#B.创建表结构

#C.开启游标

#D.获取游标记录

#E.插入数据到新表中

#F.关闭游标

#创建一个存储过程
create procedure p11(in uage int)
begin
  declare uname varchar(100);#声明变量
  declary upro varchar(100);#声明变量
#声明游标记录符合条件的结果集
  declare u_cursor cursor for select name,profession from tb_user where age <= uage;
  drop table if exists tb_user_pro;  #tb_user_pro表如果存在,就删除。
  create table if exists tb_user_pro(  #if exists代表表存在就删除了再创建表
  id int primary key auto_increment,
  name varchar(100),
  profession varchar(100)
  );
  open u_cursor;#开启游标
#while循环获取游标当中的数据
  while true do
  fetch u_cursor into uname,upro;#获取游标中的记录
  insert into tb_user_pro values(null,uname,upro);#将获取到的数据插入表结构中
  end while;
  close u_cursor;#关闭游标
end;
#查询年龄小于30
call p11(30);

三、条件处理程序

条件处理程序handler可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。

1、语法

declare handler_action handler for condition_value [,condition_value]... statement;

handler_action

  • continue:继续执行当前程序
  • exit:终止执行当前程序 

condition_value

  • SQLSTATE sqlstate_value:状态码,如02000
  • SQLwarning:所有以01开头的SQLstate代码的简写
  • not found:所有以02开头的SQLSTATE代码的简写
  • SQLexception:所有没有被SQLwarning或not found捕获的SQLstate代码的简写

2、解决报错

#创建一个存储过程
create procedure p11(in uage int)
begin
  declare uname varchar(100);#声明变量
  declary upro varchar(100);#声明变量
#声明游标记录符合条件的结果集
  declare u_cursor cursor for select name,profession from tb_user where age <= uage;
#声明一个条件处理程序,当满足SQL状态码为02000的时候,触发退出操作,退出的时候将游标关闭
  declare exit handler for SQLSTATE '02000' close u_cursorl;
#声明一个条件处理程序,当满足SQL状态码为02000的时候,触发退出操作,退出的时候将游标关闭
  declare exit handler for not found close u_cursorl;
drop table if exists tb_user_pro;  #tb_user_pro表如果存在,就删除。
  create table if exists tb_user_pro(  #if exists代表表存在就删除了再创建表
  id int primary key auto_increment,
  name varchar(100),
  profession varchar(100)
  );
  open u_cursor;#开启游标
#while循环获取游标当中的数据
  while true do
  fetch u_cursor into uname,upro;#获取游标中的记录
  insert into tb_user_pro values(null,uname,upro);#将获取到的数据插入表结构中
  end while;
  close u_cursor;#关闭游标
end;
#查询年龄小于30
call p11(30);

mysql存储过程-游标 CURSOR FOR

1、游标

游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。

2、定义游标

这个过程并没有检索到数据,只是定义要使用的select语句

DECLARE t_cursor CURSOR FOR SELECT t.id FROM t_dept t;

3、如果没有数据返回或者select出现异常,程序继续,并将变量done设为true

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=true;

4、打开游标

open t_cursor;

5、使用游标

使用fetch来取出数据

fetch t_cursor in variable;

6、关闭游标

close t_cursor;

过程:定义游标(使用游标前必须先定义游标)—》打开游标—》关闭游标

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL的安装与配置详细教程

    MySQL的安装与配置详细教程

    MySQL是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的,本文主要以Mysql免安装版为例,帮助大家解决安装与配置mysql的步骤
    2021-06-06
  • Mysql主从同步Last_IO_Errno:1236错误解决方法

    Mysql主从同步Last_IO_Errno:1236错误解决方法

    最近遇到Mysql主从同步的Last_IO_Errno:1236错误问题,然后在网上查找相关解决方案,这里分享给大家,供参考。
    2017-10-10
  • MYSQL5.7 全文检索中文无返回数据的问题解决

    MYSQL5.7 全文检索中文无返回数据的问题解决

    本文介绍了MYSQL5.7 全文检索中文无返回数据的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 修改MySQL密码的四种方法总结(适合初学者!)

    修改MySQL密码的四种方法总结(适合初学者!)

    在日常使用数据库的过程中,难免会遇到需要修改账号密码的情景,比如密码太简单需要修改、密码过期需要修改、忘记密码需要修改等,下面这篇文章主要给大家介绍了关于修改MySQL密码的四种方法,介绍的方法非常适合初学者,需要的朋友可以参考下
    2022-08-08
  • 非常实用的MySQL函数全面总结详解示例分析教程

    非常实用的MySQL函数全面总结详解示例分析教程

    这篇文章主要为大家介绍了非常实用的MySQL函数的详解示例分析,文中全面的概括了MySQL函数,并进行了详细的示例讲解,有需要的朋友可以借鉴参考下
    2021-10-10
  • mysql初始化命令mysqld --initialize参数说明小结

    mysql初始化命令mysqld --initialize参数说明小结

    本文主要介绍了mysql初始化命令mysqld --initialize参数说明小结,文中通过图表代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • MySQL Left JOIN时指定NULL列返回特定值详解

    MySQL Left JOIN时指定NULL列返回特定值详解

    我们有时会有这样的应用,需要在sql的left join时,需要使值为NULL的列不返回NULL而时某个特定的值,比如0。这个时候,用is_null(field,0)是行不通的,会报错的,可以用ifnull实现,但是COALESE似乎更符合标准
    2013-07-07
  • MySQL表的CURD使用

    MySQL表的CURD使用

    文章主要介绍了MySQL数据库操作的基本方法,包括创建表、插入数据、查询数据、更新数据和删除数据等,涵盖了表结构设计、数据插入、查询条件、排序、分页、更新和删除操作,以及聚合函数和GROUP BY子句的使用
    2025-02-02
  • MySQL高可用架构之MHA架构全解

    MySQL高可用架构之MHA架构全解

    MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能,本文重点给大家介绍MySQL高可用架构之MHA架构全解,感兴趣的朋友一起看看吧
    2021-07-07
  • Mysql如何使用命令实现分级查找帮助详解

    Mysql如何使用命令实现分级查找帮助详解

    这篇文章主要给大家介绍了关于Mysql如何使用命令实现分级查找帮助的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08

最新评论