2

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

ストア プロシージャ内で 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> 

興味のある方は、これが動作している SHOW CREATE TABLE ラッパーの結果です

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 ;
4

1 に答える 1

2

このようにテーブル名を渡すことはできませんが、この目的で次のようにprepareステートメントを使用できます-

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 ;
于 2012-04-13T06:03:10.233 に答える