【问题标题】:MySQL : How to Create table dynamically in stored procedure?MySQL:如何在存储过程中动态创建表?
【发布时间】:2016-05-05 05:36:48
【问题描述】:

我想删除并创建一个名称在存储过程参数中传递的表。我已经编写了以下存储过程。

CREATE DATABASE db1;
USE db1;
DROP PROCEDURE IF EXISTS drop_create;
DELIMITER $$  
CREATE PROCEDURE drop_create(IN tbname VARCHAR(15))
BEGIN

SET @droptable = CONCAT ("DROP TABLE IF EXISTS ", tbname);
SET @createtable = CONCAT("CREATE TABLE ", tbname, " (c0 INT PRIMARY KEY,  c1 VARCHAR(16000)" );

PREPARE deletetb FROM @droptable;
PREPARE createtb FROM @createtable ;

EXECUTE deletetb ; 
EXECUTE createtb; 

DEALLOCATE PREPARE createtb ;
DEALLOCATE PREPARE deletetb ;

END $$
DELIMITER ;

当我执行它时,我得到以下错误。

Call db1.drop_create('abd');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

显然,我无法在上面的 SP 中找到语法错​​误。我究竟做错了什么?问题必须在 CREATE TABLE 相关语句中,因为当我评论第 8、10、12 和 13 行时,SP 工作正常。我正在使用 Mysql 5.6

【问题讨论】:

    标签: mysql stored-procedures mysql-error-1064


    【解决方案1】:

    哎呀!以下语句中缺少 右大括号

    SET @createtable = CONCAT("CREATE TABLE ", tbname, " (c0 INT PRIMARY KEY, c1 VARCHAR(16000)" );
    

    应该是:

    SET @createtable = CONCAT("CREATE TABLE ", tbname, " (c0 INT PRIMARY KEY, c1 VARCHAR(16000))" );
                                                                                               ^
    

    【讨论】:

      【解决方案2】:

      您的代码有很多错误。正在更正如下。 VARCHAR 不能取 1600。它可以在 550 左右。

      DELIMITER $$  
      CREATE DATABASE db1;
      USE db1;
      DROP PROCEDURE IF EXISTS drop_create;
      
      CREATE PROCEDURE drop_create(IN tbname VARCHAR(15))
      BEGIN
      
      SET @droptable = CONCAT ('DROP TABLE IF EXISTS  ', tbname);
      PREPARE deletetb FROM @droptable;
      EXECUTE deletetb ;
      DEALLOCATE PREPARE deletetb ;
      
      SET @createtable = CONCAT('CREATE TABLE ', tbname, ' (c0 INT  NOT NULL AUTO_INCREMENT, c1 VARCHAR(550),PRIMARY KEY(c0))ENGINE=InnoDB DEFAULT CHARSET=utf8');
      PREPARE createtb FROM @createtable ; 
      EXECUTE createtb;
      DEALLOCATE PREPARE createtb ;
      
      END $$
      DELIMITER ;
      

      现在试试。代码应该运行良好。

      【讨论】:

      • VARCHAR 在 MySQL 中最多可达 65535 个字节。见The CHAR and VARCHAR types
      • 感谢 Bill Kanwin 先生被隔离为一个有用的补充。
      • 感谢 Bill Karwin 先生被隔离为一个有用的补充。
      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 2012-03-02
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2013-07-18
      相关资源
      最近更新 更多