/** 创建存储过程 
  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;