本文共 1836 字,大约阅读时间需要 6 分钟。
需求描述 要为数据库里的所有的表统一加上十六个备用字段,前提是备用字段名取表名前三位,拼接上备用1-16 , 16个字段中,其中8个varchar, 4个int, 4个datetime
DROP TABLE customer_detail_info;CREATE TABLE `customer_detail_info` ( `cus_id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`cus_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 查看表结构DESC customer_detail_info;
表结构截图:
DROP PROCEDURE IF EXISTS `procedure_update_table`;DELIMITER ;;CREATE PROCEDURE `procedure_update_table`(IN table_name VARCHAR(50))BEGINdeclare i int;DECLARE sq VARCHAR(8000);SET i = 1 ;WHILE i < 17 DO-- 取表名前三位set @qz = LEFT(table_name,3);-- 拼接字段名set @pp = CONCAT(@qz,i);-- 前八个字符类型IF i < 9 THENSET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' VARCHAR(8) ');-- 中间四个intELSEIF (i > 8 && i < 13) THENSET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' INT(11)');-- 其他的时间类型ELSE SET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' DATETIME ');end IF;SET i = i + 1 ;SET @_SQL = sq ;-- 预定义sqlPREPARE stmt FROM @_SQL ;-- 执行sqlEXECUTE stmt ;-- 释放连接DEALLOCATE PREPARE stmt;-- 结束While 循环END WHILE;END;
-- 已存在的存储删除DROP PROCEDURE IF EXISTS procedure_get_all_tables;DELIMITER ;;CREATE PROCEDURE procedure_get_all_tables()BEGIN-- 用于判断是否结束循环DECLARE done int DEFAULT 0;-- 存储表名称的变量DECLARE cur VARCHAR(200);DECLARE tbs_list CURSOR FOR SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_Schema = 'hqh_log';-- 定义 设置循环结束标识done值怎么改变 的逻辑declare continue handler for not FOUND set done = 1; OPEN tbs_list;-- 循环开始 REPEATFETCH tbs_list INTO cur;if not done THEN CALL procedure_update_table(cur);end if;until done end repeat;CLOSE tbs_list;END;
-- 调用存储过程CALL procedure_get_all_tables();-- 查看表结构DESC customer_detail_info;
给大家在提供一个mybatis调用存储过程的例子