20. Mysql 游标的定义和使用

文章目录

    • 概念
    • 游标的基本语法
      • 声明游标
      • 打开游标
      • 使用游标
      • 关闭游标
      • 精选示例
    • 总结

概念

游标(Cursor)是一种数据库对象,可以指向存储在数据库表中的数据行指针。用于在 sql 语句的执行过程中,通过对查询结果集进行逐行的操作和访问。它提供了一种逐行遍历结果集的方式,可以在查询结果集上进行灵活的操作和处理。

使用场景:

  • 需要逐行处理查询结果集,进行一些特定的操作或计算。
  • 需要在一个事务中多次访问相同的查询结果集。
  • 需要在一个过程中对查询结果集进行多次迭代。
  • 需要对查询结果集进行一些复杂的业务逻辑处理。

使用限制:

  • 只能在存储过程、函数和触发器中使用游标。
  • 游标只能存放 select 语句查询的结果集合,不能存放 show 语句查询的结果。

游标的基本语法

声明游标

使用 declare 语句来声明一个游标,并指定查询语句作为游标的结果集。

示例代码:

declare cursor_name cursor for select_statement;

打开游标

使用 open 语句来打开一个游标,打开游标即将查询结果集加载到游标中,为后面游标的逐条读取结果集中的记录做准备。

示例代码:

open cursor_name;

使用游标

使用 fetch 语句,可以从游标中获取一行数据,并将数据赋值给变量。

示例代码:

fetch cursor_name into variable1, variable2[, variable3, ...];

使用游标的作用是让 cursor_name 这个游标来读取当前行,并且将数据保存到 variable 这个变量中,游标指针依次指到下一行。如果游标读取的数据行有多个列名,则在 into 关键字后面赋值给多个变量名即可。

variable1 必须在声明游标之前就定义好。游标的查询结果集中的列数,必须跟 into 后面的变量数一致,否则,在存储过程执行的时候,会提示错误。

关闭游标

使用 close 语句来关闭一个游标,因为游标会占用系统资源 ,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。

示例代码:

close cursor_name;

精选示例

需求:统计数据库中每个表的实际数量。

方法一:创建存储过程,并且使用游标。

drop procedure if exists get_table_info;
create procedure get_table_info()
begin
    -- 定义变量
    declare finished bool default 0;
    declare db_tb_name varchar(255) default '';
    declare for_cnt int default 0;

    -- 声明游标
    declare cur cursor for
        select concat('`', table_schema, '`.`', table_name, '`') as db_tb_name
        from information_schema.tables
        group by table_schema, table_name;-- 将所有表查询出来

    declare continue handler for not found set finished = 1;-- 无数据更新finished变量

    -- 打开游标
    open cur;
    truncate table sql_test1.table_info;-- 清空表数据
    l1:
    loop
        fetch cur into db_tb_name;-- 使用游标
        if finished = 1 then
            leave l1;
        end if;
        set @sql = '';
        set @sql = concat('insert into sql_test1.table_info(db_tb_name,fact_cnt) \n\tselect \'', db_tb_name,'\',count(*) \n\tfrom ', db_tb_name);
        prepare stmt from @sql;-- 预编译准备好的拼接sql
        execute stmt;-- 执行
        deallocate prepare stmt;-- 释放
    end loop;
    -- 关闭游标
    close cur;
    select '录入完成。' as info;
end;

call get_table_info();-- 调用
select * from sql_test1.table_info;-- 查询结果

在这里插入图片描述

其中,当游标无数据触发 not found 异常的时候,将变量更新为 finished = 1 ,这样就可以控制循环的退出了。

方法二:创建存储过程,不使用游标。

drop procedure if exists get_table_info1;
create procedure get_table_info1()
begin
    declare i int default 1;
    -- 计算出需要遍历查询的表总数
    set @max_db_tb_cnt = (select count(distinct table_schema, table_name) as db_tb_cnt
                          from information_schema.tables);

    truncate table sql_test1.table_info;-- 清空表数据
		-- 根据表的总数量遍历
    while i <= @max_db_tb_cnt
        do
            set @db_tb_name = '';
            set @sql = '';
            select db_tb_name
            into @db_tb_name
            from (select db_tb_name
                       , row_number() over (order by db_tb_name) as row_number1
                  from (select concat(table_schema, '.', table_name) as db_tb_name
                        from information_schema.tables) as t1) as t2
            where row_number1 = i;-- 根据遍历的i变量,查询出对应的表名,并且更新@db_tb_name变量
            set @sql = concat('insert into sql_test1.table_info(db_tb_name,fact_cnt) \n\tselect \'', @db_tb_name,
                              '\',count(*) \n\tfrom ', @db_tb_name);
            prepare stmt from @sql;
            execute stmt;
            deallocate prepare stmt;
            set i = i + 1;-- 更新
        end while;
    select '录入完成。' as info;
end;

call get_table_info1();
select * from sql_test1.table_info;

不使用游标,该方法利用 row_number 开窗函数给每个结果集编号,再利用循环即可实现最终结果。

总结

通过游标的知识和示例,可以发现游标其实并不复杂,非常好理解,就是依次遍历结果集,如果结果集中有特殊的序号,也是可以实现一样的效果,方法不嫌多,多去实践用起来。

参考资料

  • MySQL Documentation Cursors
  • MySQL Cursor Tutoria
  • Mysql 存储过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/300088.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置

目录 1、Hive安装 2、HiveJDBC访问 2.1、启动hiveserver2服务 2.2、连接hiveserver2服务 2.3、注意 3、Hive常用交互命令 3.1、“-e”不进入hive的交互窗口执行sql语句 3.2、“-f”执行脚本中sql语句 4、Hive其他命令操作 4.1、退出hive窗口 4.2、在hive cli命令窗口…

rosbag 源码阅读笔记-1

这篇文字想通过在自己的机器上查找rosbag的源码在哪里&#xff08;而不是通过google搜索&#xff09;&#xff0c;来和大家分享一些ros和python的常用命令&#xff0c;了解一下rosbag的调用过程。 怎么查到源码在哪里 当然我们可以直接上ros的官网去查看&#xff0c;路径在这…

静态网页设计——科学家网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1wg4y1Q7qm/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

基于Springboot的在线考试系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88499371 mysql5、mysql8都可使用 内含配置教程文档&#xff0c;一步一步配置 Springboot所写 管理员页面 学生页面

jetson deepstream 解码接入编码输出

不需要编解码输出画面的直接到7 使用就行 1 jetson主板编译工具 在jetson主板上安装gstreamer工具链&#xff0c;编译opencv sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-ugly gstreamer1.0-rtsp python3-dev pytho…

【信息论与编码】习题-判断题-第三部分

目录 判断题48. 利用状态极限稳态分布概率和符号的状态一步转移概率来求m阶马尔可夫信源的极限熵。49. 连续信源或模拟信号的信源编码的理论基础是限失真信源编码定理 。50. 具有一一对应关系的无噪信道的信道容量CH(X)。51. 在游程编码过程中&#xff0c;“0”游程和“1”游程…

PHP进阶-实现网站的QQ授权登录

授权登录是站点开发常见的应用场景&#xff0c;通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先&#xff0c;我们需要申请QQ互联开发者账号获得APPID和密钥&#xff1b;接着&#xff0c;我们下载QQ官方SDK&#xff1a;PHP SDK v…

【VTKExamples::Visualization】第一期 Arbitrary3DCursor

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 本文分享Example中Visualization模块中的Arbitrary3DCursor样例&#xff0c;主要解析vtkProbefileter&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会…

大学物理实验重点——霍尔效应

霍尔系数 霍尔元件灵敏度&#xff0c;愈大愈好 负效应&#xff1a; 1. 不等位电势 V0&#xff1a;两个霍尔电极不可能绝对对 称地焊在霍尔元件两侧&#xff08;图 2&#xff09;、霍尔元件电阻率不均匀、工作电极的端面接触不良都 可能造成 C、D 两极不处在同一等位面上。R0 确…

XCTF:凯撒大帝在培根里藏了什么[WriteUP]

密文&#xff1a; ABBABAABBAAAAABABABAABABBAAAAABAABBAAABAABBBABBAABABBABABAAABABBBAABAABABABBBAABBABAA 根据题目提示&#xff0c;应该有两种加密算法 1.培根加密 2.凯撒加密 根据语境&#xff0c;且密文与凯撒加密后的密文不符合&#xff0c;先尝试培根解密 培根解…

大数据时代必备技能!Shell脚本学习网站助你一臂之力!

介绍&#xff1a;Shell脚本是一种用于自动化任务的脚本语言&#xff0c;它使用Shell命令来执行一系列操作。Shell脚本通常以.sh为扩展名&#xff0c;并使用#!/bin/bash作为第一行来指定使用的Shell解释器。 在Shell脚本中&#xff0c;我们可以使用各种命令和控制结构来实现自动…

Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗&#xff1f;这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。 通过对 Dockerfile 进行 lint 检查&#xff0c;您可以及早发现错误和问题&#xff0c;并确保它们遵循最佳实践。 什么是Hadolint…

数据结构期中模拟

一、填空题 1.二叉树就是度为 2 的树。&#xff08;F&#xff09; 二叉树的度<2 2.线性表采用链式存储表示时&#xff0c;所有结点之间的存储单元地址可以连续也可以不连续。(T) 在顺序表中&#xff0c;逻辑上相邻的元素&#xff0c;其物理位置一定相邻。在单链表中&#x…

java案例知识点

一.会话技术 概念 技术 二.跨域 三.过滤器 四.拦截器

电脑丢失dll文件怎么办,dll修复工具可一键修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。那么&#xff0c;究竟是什么原因导致了dll文件的丢失呢&#xff1f;又该如何预防dll文件…

Linux 编译安装 Nginx

目录 一、前言二、四种安装方式介绍三、本文安装方式&#xff1a;源码安装3.1、安装依赖库3.2、开始安装 Nginx3.3、Nginx 相关操作3.4、把 Nginx 注册成系统服务 四、结尾 一、前言 Nginx 是一款轻量级的 Web 服务器、[反向代理]服务器&#xff0c;由于它的内存占用少&#xf…

CentOS中开启mysql挂载

挂载的作用其实说白了就是备份。防止数据库文件损害或者数据库被误删导致数据丢失。 创建一个文件名为my.cnf内容如下 # Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modif…

用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

在本文中&#xff0c;使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序&#xff0c;可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few…

Halcon区域的灰度特征值gray_features

Halcon区域的灰度特征值 gray_features 算子用于计算指定区域的灰度特征值。其输入是一组区域&#xff0c;每个区域的特征都存 储在一组value数组中。 典型的基于灰度值的特征如下&#xff1a; &#xff08;1&#xff09;area&#xff1a;灰度区域面积。 &#xff08;2&#x…

c++学习第八讲---类和对象---继承

继承&#xff1a; 使子类&#xff08;派生类&#xff09;拥有与父类&#xff08;基类&#xff09;相同的成员&#xff0c;以节约代码量。 1.继承的基本语法&#xff1a; class 子类名&#xff1a;继承方式 父类名{} &#xff1b; 例&#xff1a; class father { public:in…