2016-05-05 12 views
2

ストアドプロシージャの引数に渡された名前のテーブルを削除して作成したいとします。私は以下のストアドプロシージャを書いた。MySQL:ストアドプロシージャで動的にテーブルを作成するには?

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

答えて

2

おっと! 閉じブレースは、次の文で行方不明になった:

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))"); 
                         ^
0

あなたのコードは次のように修正されている.IT多くのエラーを持っています。 VARCHARは1600.ItがNOW try.Theコードがうまく機能しなければならない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 ; 

arroundの可能asumeすることはできません。

+0

MySQLではVARCHARを65535バイトまでにすることができます。 [The CHAR and VARCHAR types](https://dev.mysql.com/doc/refman/5.7/en/char.html)を参照してください。 –

+0

Mr.Bill Kanwinさん、有益な追加をしてくれてありがとうございます。 –

+1

Mr.Bill Karwinさん、有益な追加をいただきありがとうございます。 –

関連する問題