目录
一、环境
mysql5.7.20
二、需求
有如下表:
现需创建新表,将某一行数据中的stuname字段值作为表名,该行数据中的valueb,valuec,valued值作为新表名的列值插入表中。
新表的字段有:valueid,value_b,value_c,value_d;其中,valueid 主键,非空,自增。value_b=valueb,value_c=valuec,value_d=valued。
最终结果如下:
需求涉及到mysql存储过程创建动态表名。
三、尝试
DROP PROCEDURE IF EXISTS pro_splitupqqq;
CREATE PROCEDURE pro_splitupqqq()
BEGIN
DECLARE s INT DEFAULT 0;
DECLARE col_a VARCHAR(255);
DECLARE col_b VARCHAR(255);
DECLARE col_c VARCHAR(255);
DECLARE col_d VARCHAR(255);
DECLARE helloset CURSOR FOR SELECT stuname,valueb,valuec,valued FROM testdes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
OPEN helloset;
FETCH helloset INTO col_a,col_b,col_c,col_d;
WHILE s<>1 DO
CREATE TABLE IF NOT EXISTS col_a(valueid TINYINT NOT NULL PRIMARY KEY auto_increment,value_b VARCHAR(255) NULL,value_c VARCHAR(255) NULL,value_d VARCHAR(255) null);
INSERT INTO col_a(value_b,value_c,value_d) VALUES (col_b,col_c,col_d);
FETCH helloset INTO col_a,col_b,col_c,col_d;
END WHILE;
CLOSE helloset;
END;
CALL pro_splitupqqq();
尝试结果:
仅生成一个表,即"CREATE TABLE IF NOT EXISTS col_a(" 指定的表,原本以为会用变量值,结果不是。此处变量创建表名无效。
值有写入。
四、实现
DROP PROCEDURE IF EXISTS pro_splitupqq;
CREATE PROCEDURE pro_splitupqq()
BEGIN
DECLARE s INT DEFAULT 0;
DECLARE col_a VARCHAR(255);
DECLARE col_b VARCHAR(255);
DECLARE col_c VARCHAR(255);
DECLARE col_d VARCHAR(255);
DECLARE helloset CURSOR FOR SELECT stuname,valueb,valuec,valued FROM testdes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
OPEN helloset;
FETCH helloset INTO col_a,col_b,col_c,col_d;
WHILE s<>1 DO
set @preparable_stmt1=CONCAT("CREATE TABLE IF NOT EXISTS ",col_a,"(valueid TINYINT NOT NULL PRIMARY KEY auto_increment,value_b VARCHAR(255) NULL,value_c VARCHAR(255) NULL,value_d VARCHAR(255) null);");
prepare stmt1 from @preparable_stmt1;
EXECUTE stmt1;
SET @tmp_b=col_b,@tmp_c=col_c,@tmp_d=col_d;
SET @preparable_stmt2=CONCAT("INSERT INTO ",col_a," (value_b,value_c,value_d) VALUES (@tmp_b,@tmp_c,@tmp_d)");
prepare stmt2 from @preparable_stmt2;
EXECUTE stmt2;
FETCH helloset INTO col_a,col_b,col_c,col_d;
END WHILE;
CLOSE helloset;
END;
CALL pro_splitupqq();
结果:
已按mysql创建动态表名需求实现。