2016-05-05 17 views
2

Ich möchte eine Tabelle löschen und erstellen mit Name im Argument der gespeicherten Prozedur übergeben. Ich habe folgende gespeicherte Prozedur geschrieben.MySQL: Wie man Tabelle dynamisch in der gespeicherten Prozedur erstellt?

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 ; 

Wenn ich es ausführe, erhalte ich folgenden Fehler.

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 

Anscheinend bin ich nicht in der Lage, den Syntaxfehler in SP oben zu finden. Was mache ich falsch? Problem muss in CREATE TABLE-bezogenen Anweisungen sein, denn wenn ich Zeile 8, 10, 12 & 13 kommentieren, dann funktioniert SP gut. Ich benutze Mysql 5.6

Antwort

2

Hoppla! eine schließende Klammer wurde in der folgenden Aussage fehlt:

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

Es sollte sein:

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

Ihr Code viele Fehler hat .it wie folgt korrigiert wird. VARCHAR kann nicht asume 1600.It 550. arround werden kann

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 ; 

JETZT try.The Code sollte gut funktioniert.

+0

VARCHAR kann in MySQL bis zu 65535 Byte umfassen. Siehe [Die CHAR- und VARCHAR-Typen] (https://dev.mysql.com/doc/refman/5.7/en/char.html). –

+0

Vielen Dank Herr Bill Kanwin für die isolierte eine nützliche Ergänzung. –

+1

Vielen Dank Mr. Bill Karwin für die isolierte eine nützliche Ergänzung. –

Verwandte Themen