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 ;
MySQLストアドプロシージャのパラメータとしてデータベース名またはテーブル名を渡すことはできません。代わりにSQL文字列と 'EXECUTE()'を作成する必要があります。つまり、SQLインジェクションについても慎重でなければなりません。 –
例については、[この質問](http://stackoverflow.com/questions/9993908/passing-fieldname-as-parameter-in-mysql-stored-procedure)を参照してください –
@ヤダ私の答えはあなたのために働いていますか? –