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 ...
随机推荐
- Linux c++ vim环境搭建系列(0)——简介
vim 学习 简介: 源码编译使用vim及其插件. 内容包含: vim的编译安装, llvm clang的编译安装, 插件youcompleteme的编译安装使用, 以及vim其他插件的使用. 搭建环 ...
- Python 操作mysql数据库之 SQLAlchemy 案例详解
前言: 字段声明类型中,最右边的是数据库中对应的字段,我们依然可以使用,其左边的的 SQLAchemy 则是其自身封装的自定义类型. 本篇不会讲太多的理论知识,因为这个实用性更强,所以通篇全部都是 ...
- fiddler composer post请求
必加部分:Content-Type: application/json
- Salesforce考试 | 如何维护我的Salesforce认证
问题1 Salesforce证书是需要每年维护吗? Salesforce每年会发布3次Realese,分别是Spring.Summer和Winter,可以理解为一年3次的系统新版本更新,每次Relea ...
- 5000+图片找到你喜欢的那个TA,Python爬虫+颜值打分
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 罗罗攀 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- 1/13 update
小组这几天的update大多都集中在UI方面: 答题界面更改了 放弃和提交按钮: 结果界面进行了颜色的调整,其中没有wordToAdd成员的不现实增加到单词本按钮: 分享结果增加APP的连接:
- timer和ScheduledThreadPoolExecutor定时任务和每日固定时间执行
//ScheduledThreadPoolExecutor每三秒执行一次 public static void main(String[] args) { ScheduledThread ...
- PHP反序列化漏洞总结
写在前边 做了不少PHP反序列化的题了,是时候把坑给填上了.参考了一些大佬们的博客,自己再做一下总结 1.面向对象 2.PHP序列化和反序列化 3.PHP反序列化漏洞实例 1.面向对象 在了解序列化和 ...
- WGCLOUD如何监控数据库
WGCLOUD默认是支持mysql,sqlserver,oracle,postgresql数据库监控,不用添加任何配置. DB2也是支持的,但是需要做一些小修改. 因为db2驱动包版本比较多,所以要自 ...
- Java 多线程 -- lambda 表达式推导
jdk 8 开始 java 引入了lambda 表达式. lambda适用场景: 1.接口或父类 2.接口或父类只有一个方法 我们从多线程写法来推导一下: 1.外部类写法: package com.x ...