涉及循环、动态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存储过程举例的更多相关文章

  1. MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明

    MariaDB.MySQL存储过程.游标基础应用举例说明 by:授客 QQ:1033553122 测试环境: MariaDB-10.0.19-centos7-x86_64 实践操作: # 创建测试数据 ...

  2. Mysql存储过程和函数

    Mysql存储过程和函数 基本概念: 创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中.例如,银行经常需要计算用户的利息.不同类别的 ...

  3. 第二百八十三节,MySQL数据库-MySQL存储过程

    MySQL数据库-MySQL存储过程 MySQL存储过程,也就是有点像MySQL函数,但是他与MySQL函数是有区别的,后面会讲到函数,所以注意区分 注意:函数与存储过程的区别 存储过程是:CREAT ...

  4. Mysql存储过程、索引

    sql语句执行顺序: from--->where--->group by--->having--->计算所有的表达式--->order by--->select 输 ...

  5. MySQL存储过程入门教程

    存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...

  6. 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...

  7. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  8. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  9. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

随机推荐

  1. python3(三十七) filepath

    """ file path """ __author__on__ = 'shaozhiqi 2019/9/23' # !/usr/bin/e ...

  2. H5 环境检测

    检测是否在客户端App内 function is_app() { var userAgent = navigator.userAgent.toLowerCase();//获取UA信息 if (user ...

  3. Angular input / ion-input ion-searchbar 实现软件盘换行 改 搜索 并且触发搜索方法 Android iOS适用

    Angular 实现软件盘 换行 改 搜索 并且除非 搜索方法:    Form 必须有 action="javascript: return true;”   input / ion-in ...

  4. iNeuOS工业互联平台,部署在智能硬件网关,实现了从边缘端到云端的一体化部署

    目       录 1.      概述... 2 2.      平台演示... 3 3.      智能硬件网关配置(参考)... 3 4.      iNeuOS在网关中的部署步骤... 5 4 ...

  5. (转) POJO和javabean的异同

    参考:http://blog.csdn.net/lushuaiyin/article/details/7436318 一:什么是POJOPOJO的名称有多种,pure old java object ...

  6. 【three.js 第一课】创建场景,显示几何体

    <!DOCTYPE html> <html> <head> <title>demo1</title> </head> <s ...

  7. golang实现常用集合原理介绍

    golang本身对常用集合的封装还是比较少的,主要有数组(切片).双向链表.堆等.在工作中可能用到其他常用的集合,于是我自己对常用的集合进行了封装,并对原理做了简单介绍,代码库地址:https://g ...

  8. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  9. Bat 脚本 删除某一行

    findstr /v /i /c:"kiwi" /c:"oranges" myfile.txt >newfile.txt

  10. [Qt] QString 常用函数

    1. append(), prepend() 2. count(), size(), length() 这三个函数是相同的 3. trimmed() 去掉首尾空格 4. isNull() 对未赋值的字 ...