【问题标题】:mysql stored procedure executing SHOW CREATE TABLEmysql存储过程执行SHOW CREATE TABLE
【发布时间】:2012-04-13 01:12:49
【问题描述】:

我正在尝试编写一个包含 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 ;

【问题讨论】:

标签: mysql


【解决方案1】:

你不能像这样传递表名,但是你可以像这样使用 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 ;

【讨论】:

    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2020-06-07
    • 2018-08-28
    • 2020-09-29
    • 1970-01-01
    相关资源
    最近更新 更多