2012-04-13 15 views
2

SHOW CREATE TABLEをラップするストアドプロシージャを作成しようとしています。私の最終目標は、information_schemaからスキーマ名を動的に検索し、SHOW CREATE TABLE schema.tableNameを実行することです。SHOW CREATE TABLEを実行するmysqlストアドプロシージャ

ストアプロシージャ内でSHOW CREATE TABLEを実行できないようです。この興味を持っているものについては

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> 

私はショーのためで終わるものですあなたはこのように、テーブル名を渡すことはできませんが、あなたができる

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

MySQLストアドプロシージャのパラメータとしてデータベース名またはテーブル名を渡すことはできません。代わりにSQL文字列と 'EXECUTE()'を作成する必要があります。つまり、SQLインジェクションについても慎重でなければなりません。 –

+0

例については、[この質問](http://stackoverflow.com/questions/9993908/passing-fieldname-as-parameter-in-mysql-stored-procedure)を参照してください –

+0

@ヤダ私の答えはあなたのために働いていますか? –

答えて

2

を働いているTABLEラッパーを作成

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

ありがとうございました。これはmysqlで動作します。 – Yada

関連する問題