IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mysql储存过程,游标,事件,预处理简单记录 -> 正文阅读

[大数据]Mysql储存过程,游标,事件,预处理简单记录

写在前面

本文使用的数据库版本为
5.7.36

案例表

create table `student` (
	`studentId` int (11),
	`studentName` varchar (300),
	`studentAge` int (11),
	`studentSex` int (11),
	`studentDetail` varchar (300),
	`sexDouble` double 
); 
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('1','1111','1','1','aaaaa','179.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('2','bbb','123','2','bbbbb','268.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('3','ccc','444','2','ccccc','359.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('9','阿松大','1','1','阿松大','449.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('10','阿松大10','2','1','阿松大10','450.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('11','张三','3','1','描述','101.50');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('20','测试','4','1','测试描述','649.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('28','嘻嘻嘻','1','1','测试描述','589.00');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('29','李四','1','1','123','212.50');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('34','里哈哈','2','3','javaJDBC','1088.90');
insert into `student` (`studentId`, `studentName`, `studentAge`, `studentSex`, `studentDetail`, `sexDouble`) values('37','4','4','4','4','93.00');

一. 储存过程

语法

-- 创建储存过程
DELIMITER $$
CREATE PROCEDURE 储存过程名称(参数(可选))
BEGIN
	-- 根据需求定义变量
	DECLARE id, age INT;
	DECLARE str VARCHAR(50);
	sql逻辑;
END$$

-- 调用储存过程
CALL 储存过程名称(参数)

注:
DELIMITER 为零时修改mysql默认结束符';' 为$$
BEGIN 为储存过程开始标识
END 为储存过程结束标识

1. 无参数储存过程

DELIMITER $$
CREATE  PROCEDURE `testTwo`()
BEGIN
	SELECT * FROM student ;
END$$

2. 有参储存过程

DELIMITER $$
CREATE PROCEDURE `testTwoT`(IN id INT)
BEGIN
	SELECT * FROM student WHERE studentId = id;
END$$

注:
IN 表示入参
	OUT 表示执行储存过程后要传出去的值
	INOUTINOUT的结合版
id 参数名称(注意要和储存过程中的变量名称/字段名称区分开)
INT 为参数类型 可以为字符串/时间等根据需求变更,多参数以,隔开
例如:IN id INT, IN str INT

二. 游标

语法

-- 游标的创建和储存过程类似
DELIMITER $$
CREATE PROCEDURE cursor_student()
BEGIN
-- 创建 游标值映射变量(注意中文VARCHAR(50) 要加字符编码CHARACTER SET utf8mb4)
DECLARE id, age INT;
-- 创建 游标中处理逻辑用到的变量
DECLARE total INT DEFAULT 0;
-- 创建 游标结束标识
DECLARE flag INT DEFAULT FALSE;
-- 创建游标
DECLARE 游标名称 CURSOR FOR 逻辑查询;
-- 判定游标结束时 结束标识 的值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = TRUE;
-- 打开游标
OPEN 游标名称 ;
-- 开始循环
循环名称:LOOP
	-- 判断游标是否结束
	IF flag THEN
		-- 跳出循环
		LEAVE load_cursor_loop;
	END IF;
	-- 获取一行数据 id和age为上面订单的“游标值映射变量”
	FETCH 游标名称 INTO id, age;
	-- 一下可做游标数据逻辑处理
	-- 。。。
-- 结束循环游标
END LOOP;
-- 关闭游标
CLOSE 游标名称;
END$$

实战

DELIMITER $$
CREATE PROCEDURE cursor_student()
BEGIN
DECLARE str VARCHAR(50) CHARACTER SET utf8mb4;
DECLARE test_id BIGINT;
DECLARE age INT;
DECLARE total INT DEFAULT 0;
DECLARE flag INT DEFAULT FALSE;
DECLARE test_cursor CURSOR FOR SELECT studentId, studentName, studentAge FROM `student`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = TRUE;
OPEN test_yb ;
load_cursor_loop:LOOP
	FETCH test_cursor INTO test_id, str, age;
	IF flag THEN
		LEAVE load_cursor_loop;
	END IF;
	IF test_id%2=0 THEN
		SET total = total + age;
	END IF;
END LOOP;
CLOSE test_cursor;
SELECT total;
END$$
注:
这个游标的功能是查询student表,将表中studentId为偶数的studentId相加最终输出。
load_cursor_loop 为循环名称可自定义
mysql储存过程中支持3中循环,可自行百度‘mysql循环’

注:

mysql游标就像是java中list集合循环,遍历的时候处理每一条数据

三. 预处理

语法

-- 定义预处理sql
SET 变量值 = sql;
-- 定义预处理变量s(可自定义)从哪个sql中获取的
PREPARE s FROM 变量值;
-- 执行预处理s
EXECUTE s;
-- 释放预处理s(释放数据库资源)
DEALLOCATE PREPARE s;

实战

SELECT COUNT(*) INTO @c FROM student;
SET @sj = FLOOR(@c * RAND());
SET @sql = CONCAT('select * from student limit ', @sj, ',3');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;

注:
此预处理语句内容为
随机取出student表中3条数据
可能回导致一条也取不出(例如student表只有10条数据,在变量@sj的值为9的时候则一条也取不出,有待优化)
注:
在mybatis中不能直接执行预处理语句,必须写成储存过程,例如
DELIMITER $$
CREATE PROCEDURE `sj_data`()
BEGIN
SELECT COUNT(*) INTO @c FROM student;
SET @sj = FLOOR(@c * RAND());
SET @sql = CONCAT('select * from student limit ', @sj, ',3');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;
END$$

四. 事件

语法

-- 创建事件
CREATE EVENT 事件名称
ON SCHEDULE EVERY 执行间隔
ON COMPLETION 执行策略
COMMENT '事件注释'
DO 事件中执行的sql;

执行间隔
	SECONDMINUTEDAYMONTHHOUR   时
执行策略
	PRESERVE 	 循环
	NOT PRESERVE 只执行一次

开启事件
	SET GLOBAL event_scheduler = ON;
关闭事件
	SET GLOBAL event_scheduler = off;
查看事件是否开启
	SHOW VARIABLES LIKE 'event_scheduler';
	
零时关闭事件
	ALTER EVENT 事件名称 DISABLE;
开启零时关闭的事件
	ALTER EVENT 事件名称 ENABLE;
注:零时关闭/开启事件只在'SET GLOBAL event_scheduler = ON'后生效

查看数据库已有事件
SELECT * FROM information_schema.EVENTS

实战

CREATE EVENT event_test_three
ON SCHEDULE EVERY 3 SECOND
ON COMPLETION PRESERVE
COMMENT '测试定时修改student表sexDouble字段2'
DO UPDATE `student` SET sexDouble = sexDouble + 1;

注:
此事件的内容为
每个3秒中将student表中sexDouble字段+1

注:

mysql事件就像是java中的定时任务

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:35  更:2022-03-16 22:31:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:03:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码