2012-04-13 26 views
2

Ich versuche eine gespeicherte Prozedur zu schreiben, die SHOW CREATE TABLE umschließt. Mein letztes Ziel ist es, den Schemanamen dynamisch nach information_schema zu suchen und SHOW CREATE TABLE schema.tableName auszuführen.mysql gespeicherte Prozedur ausgeführt SHOW CREATE TABLE

Es scheint, dass ich SHOW CREATE TABLE innerhalb einer Speicherprozedur nicht ausführen kann.

DELIMITER $$ 
DROP PROCEDURE IF EXISTS ct$$ 
CREATE PROCEDURE ct (tableName VARCHAR(50)) 
BEGIN 

    SHOW CREATE TABLE tableName; 

END$$ 
DELIMITER ; 


mysql> CALL ct('users'); 
ERROR 1146 (42S02): Table 'adcentraldb.tableName' doesn't exist 
mysql> 

Für diejenigen, die interessiert sind, das ist, was ich mit der SHOW TABLE-Wrapper CREATE am Ende, die

DELIMITER $$ 
DROP PROCEDURE IF EXISTS ct$$ 

-- Wraps around SHOW CREATE TABLE. Look at other schemas other than current. 
CREATE PROCEDURE ct (tableName VARCHAR(50)) 
BEGIN 
    DECLARE dbName VARCHAR(50); 

    SET dbName = (SELECT `TABLE_SCHEMA` FROM `INFORMATION_SCHEMA`.`TABLES` 
    WHERE `TABLE_NAME` = tableName LIMIT 1); 

    SET @a=CONCAT("SHOW CREATE TABLE ", dbName, '.', tableName); 
    PREPARE stmt1 FROM @a; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 

END$$ 
DELIMITER ; 
+0

Sie können keine Datenbank- oder Tabellennamen als Parameter in einer gespeicherten MySQL-Prozedur übergeben. Stattdessen müssen Sie eine SQL-Zeichenfolge und 'EXECUTE()' es erstellen, was bedeutet, dass Sie auch bei SQL-Injection vorsichtig sein müssen. –

+0

Siehe [diese Frage] (http://stackoverflow.com/questions/9993908/passing-fieldname-as-parameter-in-mysql-stored-procedure) für ein Beispiel –

+0

@ Yada meine Antwort funktioniert für Sie oder nicht? –

Antwort

2

Sie können keine Tabellennamen wie dies passieren, aber Sie können funktioniert Verwenden Sie hierzu die Anweisung prepare für diesen Zweck -

DELIMITER $$ 
DROP PROCEDURE IF EXISTS ct$$ 
CREATE PROCEDURE ct (tableName VARCHAR(50)) 
BEGIN 

    set @a=concat("SHOW CREATE TABLE ",tableName); 
    PREPARE stmt1 FROM @a; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 

END$$ 
DELIMITER ; 
+1

danke. Dies funktioniert in MySQL. – Yada

Verwandte Themen