MySQL全面瓦解19:游标相关
定义
游标的作用
1 select studentid,studentname,score from students;
游标的使用
声明游标
1 DECLARE cursor_name CURSOR FOR select_statement;
打开游标
1 OPEN cursor_name;
遍历游标数据
1 FETCH cursor_name INTO var_list;
关闭游标
1 CLOSE cursor_name;
游标举例
数据基础
1 mysql> select * from students;
2 +-----------+-------------+-------+---------+
3 | studentid | studentname | score | classid |
4 +-----------+-------------+-------+---------+
5 | 1 | brand | 97.5 | 1 |
6 | 2 | helen | 96.5 | 1 |
7 | 3 | lyn | 96 | 1 |
8 | 4 | sol | 97 | 1 |
9 | 5 | b1 | 81 | 2 |
10 | 6 | b2 | 82 | 2 |
11 | 7 | c1 | 71 | 3 |
12 | 8 | c2 | 72.5 | 3 |
13 | 9 | lala | 73 | 0 |
14 | 10 | A | 99 | 3 |
15 | 16 | test1 | 100 | 0 |
16 | 17 | trigger2 | 107 | 0 |
17 | 22 | trigger1 | 100 | 0 |
18 +-----------+-------------+-------+---------+
19 13 rows in set
编写包含游标的函数
这边注释很清晰,关键知识点都已经标红
1 mysql>
2 /*判断函数如果存在则删除*/
3 DROP FUNCTION IF EXISTS fun_test;
4 /*声明结束符为$*/
5 DELIMITER $
6 /*创建函数,对符合条件的每个同学的分数进行加分,加的分数不能超过给定的值max_score*/
7 CREATE FUNCTION fun_test(max_score decimal(10,2))
8 RETURNS int
9 BEGIN
10 /*定义实时StudentId的变量*/
11 DECLARE var_studentId int DEFAULT 0;
12 /*定义计算后分数的变量*/
13 DECLARE var_score decimal(10,2) DEFAULT 0;
14 /*定义游标结束标志变量*/
15 DECLARE var_done int DEFAULT FALSE;
16 /*创建游标*/
17 DECLARE cur_test CURSOR FOR SELECT studentid,score from students where classid<>0;
18 /*游标结束时会设置var_done为true,后续可以使用var_done来判断游标是否结束*/
19 DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_done=TRUE;
20 /*打开游标*/
21 OPEN cur_test;
22 /*使用Loop循环遍历游标*/
23 select_loop:LOOP
24 /*先获取当前行的数据,然后将当前行的数据放入var_studentId,var_score中,如果无数据行了,var_done会被置为true*/
25 FETCH cur_test INTO var_studentId,var_score;
26 /*通过var_done来判断游标是否结束了,退出循环*/
27 IF var_done THEN
28 LEAVE select_loop;
29 END IF;
30 /*对var_score值添加随机值,不能超过给定的分数*/
31 set var_score = var_score + LEAST(ROUND(rand()*10,0),max_score);
32 update students set score = var_score where studentId= var_studentId;
33 END LOOP;
34 /*关闭游标*/
35 CLOSE cur_test;
36 /*返回结果:可以根据实际情况返回需要的内容*/
37 RETURN 1;
38 END $
39 /*结束符置为;*/
40 DELIMITER ;
41 Query OK, 0 rows affected
调用函数
1 mysql>
2 /* 参数为8,表示加分上限为8 */
3 select fun_test(8);
4 +-------------+
5 | fun_test(8) |
6 +-------------+
7 | 1 |
8 +-------------+
9 1 row in set
查看结果
对比原来的成绩的值,发现成绩添加了随机值,但没超过给定的分数 8
1 mysql> select * from students;
2 +-----------+-------------+-------+---------+
3 | studentid | studentname | score | classid |
4 +-----------+-------------+-------+---------+
5 | 1 | brand | 105.5 | 1 |
6 | 2 | helen | 98.5 | 1 |
7 | 3 | lyn | 97 | 1 |
8 | 4 | sol | 97 | 1 |
9 | 5 | b1 | 89 | 2 |
10 | 6 | b2 | 90 | 2 |
11 | 7 | c1 | 76 | 3 |
12 | 8 | c2 | 73.5 | 3 |
13 | 9 | lala | 73 | 0 |
14 | 10 | A | 100 | 3 |
15 | 16 | test1 | 100 | 0 |
16 | 17 | trigger2 | 107 | 0 |
17 | 22 | trigger1 | 100 | 0 |
18 +-----------+-------------+-------+---------+
19 13 rows in set
查看触发器日志
符合条件被修改分数的有9条数据,都已经被触发器记录到日志里面了
1 mysql>
2 /*上一篇编写了触发器,当修改students表的时候触发日志记录 */
3 select * from triggerlog;
4 +----+--------------+---------------+-----------------------------------------+
5 | id | trigger_time | trigger_event | memo |
6 +----+--------------+---------------+-----------------------------------------+
7 | 1 | after | insert | new student info,id:21 |
8 | 2 | after | update | update student info,id:21 |
9 | 3 | after | update | delete student info,id:21 |
10 | 4 | after | update | from:test2,101.00 to:trigger2,106.00 |
11 | 5 | after | update | from:trigger2,106.00 to:trigger2,107.00 |
12 | 6 | after | update | delete student info,id:11 |
13 | 7 | after | update | from:brand,97.50 to:brand,105.50 |
14 | 8 | after | update | from:helen,96.50 to:helen,98.50 |
15 | 9 | after | update | from:lyn,96.00 to:lyn,97.00 |
16 | 10 | after | update | from:sol,97.00 to:sol,97.00 |
17 | 11 | after | update | from:b1,81.00 to:b1,89.00 |
18 | 12 | after | update | from:b2,82.00 to:b2,90.00 |
19 | 13 | after | update | from:c1,71.00 to:c1,76.00 |
20 | 14 | after | update | from:c2,72.50 to:c2,73.50 |
21 | 15 | after | update | from:A,99.00 to:A,100.00 |
22 +----+--------------+---------------+-----------------------------------------+
23 15 rows in set
游标的执行过程
总结
1、游标用来对查询结果进行遍历处理。
2、游标的使用过程:声明游标、打开游标、遍历游标、关闭游标。
3、游标主要用在循环处理、存储过程、函数中使用,用来查询结果集。
4、游标的缺点是只能一行一行操作,在数据量大的情况下,是不适用的,速度过慢。数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。
MySQL全面瓦解19:游标相关的更多相关文章
- MySQL全面瓦解24:构建高性能索引(策略篇)
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦 ...
- MySQL全面瓦解25:构建高性能索引(案例分析篇)
回顾一下上面几篇索引相关的文章: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦解23:MySQL索引实现和使用 MySQL全面瓦解24:构建高性能索引(策略篇) 索引的十大原则 1. ...
- 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析
主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表. Mysql ...
- MySQL全面瓦解13:系统函数相关
概述 提到MySQL的系统函数,我们前面有使用过聚合函数,其实只是其中一小部分.MySQL提供很多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,并更加灵活地满足不同用 ...
- MySQL全面瓦解23:MySQL索引实现和使用
MySQL索引实现 上一篇我们详细了解了B+树的实现原理(传送门).我们知道,MySQL内部索引是由不同的引擎实现的,主要包含InnoDB和MyISAM这两种,并且这两种引擎中的索引都是使用b+树的结 ...
- MySQL 5.7.19 简易安装、卸载教程
前言:传统的 exe 文件安装的MySQL,安装后特别难卸载,而且一旦处理不好,就容易出错,想再安装别的版本也不容易.因为这种方式的安装,虽然是不断的下一步,但是卸载的时候需要处理很多,在本文最后,有 ...
- MySQL中函数、游标、事件、视图
MySQL中函数.游标.事件.视图基本应用举例(代码) MySQL中function用户自定义函数c,fun,fun是面向过程的实现方式只能传入参数,或不传入参数,不能传出参数,必有返回值函数中是不能 ...
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
- WordPress 4.8 安装配置教程 (基于 centos 7.3, php 7.0, mysql 5.7.19, nginx 1.12.1)
最近想要整个 blog,记录自己工作.学习中的点滴.Wordpress 自然是首选,因为内容才是关键,所以也就不怕别人说太 low.网上大部份都是讲 wordpress 配合 apache 的安装教程 ...
随机推荐
- 多任务-python实现-进程pool(2.1.9)
@ 目录 1. 概念 2.python代码实现 1. 概念 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动 ...
- 豆瓣读书top250数据爬取与可视化
爬虫–scrapy 题目:根据豆瓣读书top250,根据出版社对书籍数量分类,绘制饼图 搭建环境 import scrapy import numpy as np import pandas as p ...
- Python循环语句代码详解:while、for、break
1 while循环 循环语句是程序设计中常用的语句之一.任何编程语言都有while循环,Python也不例外.while循环的格式如下所示. while(表达式): - else: ...
- 卡尔曼滤波学习笔记1-Matlab模拟温度例子--代码比较乱,还需优化
温度模拟参数选取 xk 系统状态 实际温度 A 系统矩阵 温度不变,为1 B.uk 状态的控制量 无控制量,为0 Zk 观测值 温度计读数 H 观测矩阵 直接读出,为1 wk 过程噪声 温度变化偏差, ...
- CentOS 8 部署 ASP.NET Core 3.1 应用程序 kestrel+Nginx IIS+kestrel
vs2019发布到IIS 下载文档https://files.cnblogs.com/files/netlock/%E4%BD%BF%E7%94%A8VS2019%E5%8F%91%E5%B8%83 ...
- ADF 第八篇:传递参数(Pipeline的Parameter和Variable,Activity的output)和应用表达式
Azure Data Factory传递参数的方式主要有两种,通过Pipeline的Parameter和Variable来传递参数,通过Activity的输出来传递参数.要在Activity中引用Pa ...
- 7.mysql8.0版本MGR搭建
搭建MGR 1.配置文件 loose-group_replication_ip_whitelist = 192.168.124.0/24 loose-group_replication_start_o ...
- springboot 中yml配置
springboot 中各种配置项纪录 1. @Value 最早获取配置文件中的配置的时候,使用的就是这个注解,SpEL表达式语言. // 使用起来很简单 @Value("${config. ...
- CentOS Linux SVN服务器 配置用户目录访问 权限 Authorization failed
SVN 修改 aurhz 文件设置用户目录访问权限格式: [/code] user=rw user 用户对code目录拥有读和写的权限. 但是访问 svn://192.168.1.59 的时候却提示A ...
- Java学习日报7.18
/** * *//** * @author 86152 * */ package trangle;import java.util.Scanner; public class Trangle{ pub ...