Centos7使用mysql5.7.20之存储过程创建动态表名-mysql创建动态表名

目录

一、环境

二、需求

三、尝试

四、实现


一、环境

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创建动态表名需求实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值