MySQL存储过程举例
涉及循环、动态sql等主要的MySQL存储过程知识。
需求:
遍历所有【test_ondev_[0-9]】开头的表,将其中的所有数据按表中的col字段存储到【test_ondev_history_ + col的值】的表里面,当【test_ondev_history_ + col】不存在的时候复制test_ondev_history的结构创建该表,并将数据存储进表里。
程序思路:
- 遍历表名
- 将每张表的col字段的内容统计出来
- 创建 test_ondev_history_ + col 的表
- 将数据插入进去test_ondev_history_ + col表中
- 继续遍历其他表
使用存储过程实现:
DELIMITER $$ CREATE PROCEDURE `p_copy_data`()
BEGIN DECLARE i INT; DECLARE v_sql_col VARCHAR(200);
DECLARE j INT;
DECLARE max_id_s INT;
DECLARE max_id INT;
DECLARE v_tbname VARCHAR(50);
DECLARE v_tbname_s VARCHAR(50);
DECLARE v_col VARCHAR(50);
DECLARE v_sql_create VARCHAR(200);
DECLARE v_sql_insert VARCHAR(200); CREATE TABLE IF NOT EXISTS temp_col(id INT PRIMARY KEY AUTO_INCREMENT,col VARCHAR(50));
CREATE TABLE IF NOT EXISTS tbnames(id INT PRIMARY KEY AUTO_INCREMENT,tbname VARCHAR(50));
TRUNCATE TABLE tbnames;
INSERT INTO tbnames(tbname)
SELECT table_name FROM information_schema.`TABLES` WHERE table_name REGEXP 'test_ondev_[0-9]';
SET i = (SELECT MIN(id) FROM tbnames);
SET max_id_s = (SELECT MAX(id) FROM tbnames); WHILE i <=max_id_s
DO
TRUNCATE TABLE temp_col;
SET v_tbname_s = (SELECT tbname FROM tbnames WHERE id = i);
SET v_sql_col = CONCAT('insert into temp_col(col) select distinct col from ',v_tbname_s);
SET @v_sql_col := v_sql_col;
PREPARE stmt FROM @v_sql_col;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt; SET j =1;
SET max_id = (SELECT MAX(id) FROM temp_col );
WHILE j <= max_id
DO
SET v_col = (SELECT col FROM temp_col WHERE id =j);
SET v_tbname = CONCAT('test_ondev_history_',v_col );
SET v_sql_create = CONCAT('create table if not exists ',v_tbname,' like test_ondev_history;');
SET @v_sql_create := v_sql_create;
PREPARE stmt FROM @v_sql_create;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
SET v_sql_insert = CONCAT('insert into ',v_tbname,' select * from ',v_tbname_s," where col='", v_col ,"';"); SET @v_sql_insert := v_sql_insert;
PREPARE stmt FROM @v_sql_insert;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt; SET j = j + 1;
END WHILE; SET i = i + 1;
END WHILE; END$$
TIPS:
MySQL不建议使用存储过程,如果临时用的话可以考虑临时使用。
另外,该过程是第一版实现历史数据的迁移,如果需要重复执行还有不少优化空间,例如:
- 遍历表的时候需要指定对应库;
- 上述过程不能重复执行,如果重复执行,需要怎么改进;
- 中途涉及创建表,如果不创建哪些临时表改如何调整;
这些就留给大家思考了,也欢迎来和我沟通。文章如果有误,欢迎斧正 ,非常感谢。
MySQL存储过程举例的更多相关文章
- MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明
MariaDB.MySQL存储过程.游标基础应用举例说明 by:授客 QQ:1033553122 测试环境: MariaDB-10.0.19-centos7-x86_64 实践操作: # 创建测试数据 ...
- Mysql存储过程和函数
Mysql存储过程和函数 基本概念: 创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中.例如,银行经常需要计算用户的利息.不同类别的 ...
- 第二百八十三节,MySQL数据库-MySQL存储过程
MySQL数据库-MySQL存储过程 MySQL存储过程,也就是有点像MySQL函数,但是他与MySQL函数是有区别的,后面会讲到函数,所以注意区分 注意:函数与存储过程的区别 存储过程是:CREAT ...
- Mysql存储过程、索引
sql语句执行顺序: from--->where--->group by--->having--->计算所有的表达式--->order by--->select 输 ...
- MySQL存储过程入门教程
存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...
- 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- MySql存储过程
MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
随机推荐
- 智芯微版本的智能配变融合终端交流采集APP
1. 交采APP基本原理 通过SPI总线周期性的召测交流采集底板的“实时数据”,对“实时数据”变换.加工.统计分析得到“分析数据”和“统计数据”后,通过MQTT总线把这些数据同步到“数据中心”供其他 ...
- CSS3 制作正方体
一.预备知识 变形属性 2D变形属性 transform:他是css3中的变形属性: 通过transform(变形) 来实现2d 或者3d 转换,其中2d 有,缩放 scale(x, y) ,移动 t ...
- 014-预处理指令-C语言笔记
014-预处理指令-C语言笔记 学习目标 1.[掌握]枚举 2.[掌握]typedef关键字 3.[理解]预处理指令 4.[掌握]#define宏定义 5.[掌握]条件编译 6.[掌握]static与 ...
- [模板]SPFA判负环
目录 一.BFS法判负环 二.DFS法判负环 三.SPFA判正环 一.BFS法判负环 Code: #include<bits/stdc++.h> #define re register # ...
- Hadoop学习笔记(2)-HDFS的基本操作(Shell命令)
在这里我给大家继续分享一些关于HDFS分布式文件的经验哈,其中包括一些hdfs的基本的shell命令的操作,再加上hdfs java程序设计.在前面我已经写了关于如何去搭建hadoop这样一个大数据平 ...
- Vue定义全局过滤器filter
这里介绍的是多个过滤器一起添加到全局中 1.创建方法 首先src下新建plugin文件夹,用来存放插件. 在plugin文件夹内新建filters.js,编写方法(如隐藏手机号码等等...) /** ...
- Java中集合的嵌套
集合的嵌套遍历 获取10个1-20之间的随机数,要求不能重复 键盘录入多个数据,以0结束,要求在控制台输出这多个数据的最大值. public static void main(String[] arg ...
- 【AspNetCore源码】设计模式 - 提供者模式
AspNetCore源代码发现日志模块的设计模式(提供者模式),特此记录 学习设计模式的好处是,我们可以容易扩展它达到我们要求,除了要知道如何扩展它,还应该在其他地方应用它 类图 & 分析 角 ...
- 微服务通信方式——gRPC
微服务设计的原则是单一职责.轻量级通信.服务粒度适当,而说到服务通信,我们熟知的有MQ通信,还有REST.Dubbo和Thrift等,这次我来说说gRPC, 谷歌开发的一种数据交换格式,说不定哪天就需 ...
- 0day笔记(1)PE文件格式与虚拟文件内存的映射
PE文件格式 PE 文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中. 一个典型的 PE 文件中包含的节如下: .text 存放着二进制的机器代码 .data 初始 ...