MySql 存储过程动态生成‘表’ or 更新表‘字段’

时间:2021-08-22 14:06:59
/** 创建存储过程 
  dbName: 数据库名称
  存储过程说明: 根据‘字段说明’表,获取相应数据

 

    t.meterTypeId:字段所对应的数据表名id(表名‘表’外键)    
    t.dataDesc:字段说明(字段注释)
    t.dataName:字段名称
    t.dataType:字段类型
  根据表名‘表’id值获取字段所对应的‘表明’,根据表明判断当前数据库里是否存放此表。
      空:创建表
      否:添加表字段
*/
DROP procedure IF EXISTS `存储名称`; create procedure 存储名称(dbName VARCHAR(100)) begin declare meterTypeId int(11); -- 表名称ID declare dataDesc VARCHAR(64); -- 表字段备注 declare dataName VARCHAR(32); -- 表字段名称 declare dataType VARCHAR(32); -- 表字段类型 declare tableName varchar(32); -- 根据‘表名称ID’值获取表名称 declare tableBool varchar(32); -- 根据dbName与tableName判断当前数据库中,此表是否存在 declare createHead varchar(100); declare createBody varchar(500); declare sql_text varchar(1000); declare done int default 0; -- 判断表中是否有数据 declare fetchSeqCursor cursor for select distinct t.meterTypeId,t.dataDesc,t.dataName,t.dataType from 字段说明‘表 AS t order by t.meterTypeId,t.dataId; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 如果表中没有数据则设置为1,跳出循环 open fetchSeqCursor;-- 打开游标 -- 循环 seq_loop:loop fetch fetchSeqCursor into meterTypeId,dataDesc,dataName,dataType; -- 遍历结果集,并赋值给变量 if done = 1 THEN leave seq_loop; end if; set tableName = (select t.dataTableName from 表名‘表’as t where t.meterTypeId = meterTypeId); -- 根据表名称ID表名 set tableBool = (select table_name from information_schema.tables where TABLE_SCHEMA=dbName and TABLE_NAME=tableName); -- 根据‘数据库’与‘表名’判断此表是否存在 -- 如果表存则往该表中添加字段,否则创建该表并添加字段 if tableBool is null THEN SET createHead = CONCAT('CREATE TABLE ', tableName); SET createBody = CONCAT('(',dataName,' ',dataType,' NOT NULL COMMENT \'',dataDesc,'\') ENGINE=INNODB DEFAULT CHARSET=utf8'); set sql_text = CONCAT(createHead,createBody); SET @sql_text=sql_text; PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt; else set createHead = CONCAT('ALTER TABLE ',tableName ); set createBody = CONCAT(' add ',dataName,' ',dataType,' NOT NULL COMMENT \'',dataDesc,'\''); set sql_text = CONCAT(createHead,createBody); SET @sql_text=sql_text; PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt; end if; select sql_text,dbName,tableName,dataName,dataType,dataDesc; end loop; close fetchSeqCursor;-- 关闭游标 end;