将`show create procedure procedure_name`的结果存储到MySql中的变量中

时间:2012-04-12 09:34:19

标签: mysql stored-procedures

我想通过使用该命令获取用于创建现有过程的代码 show create procedure然后将其存储在变量中。所有这些都在程序中。

问题

    用于创建用户定义变量的
  • Set @var仅在结果包含一行和一列时才有效。
  • show create procedure proc_name返回多列,我无法选择Create Function
  • 的特定列

问题

如何将用于创建过程的代码保存到变量中以供以后使用。

2 个答案:

答案 0 :(得分:1)

您可以使用information_schema数据库中的例程表。

select
routine_definition
from
information_schema.routines
where
specific_name = 'nameOfYourStoredProcedure'

有关详细信息,请参阅此link.

更新:

然后你必须自己构建它。别无他法。

select
CONCAT('CREATE PROCEDURE nameOfYourStoredProcedure ', routine_definition, 'END') /*something like that, this here is pseudo-code*/
from
information_schema.routines
where
specific_name = 'nameOfYourStoredProcedure'

更新2:

考虑到Devart的评论,您还必须使用information_schema数据库中的参数表。

注意:此表已添加MySQL 5.5.3

有关详细信息,请查看here.

老实说,我不知道有任何其他方法可以解决这个问题。此外,我无法在此更新到5.5.3以帮助您。祝你好运。

答案 1 :(得分:0)

在大多数情况下,

以下片段应该可以使用,我开始研究它,希望它足够简单。 但是有很多问题需要解决,例外情况。

我猜使用SHOW CREATE / MySQLDump仍然是一个更好的解决方案(即使它不允许将响应读入变量)。

SELECT 
CONCAT_WS(' ',
        'DELIMITER $$\n',
        'CREATE ',
        CONCAT_WS('=',r.SECURITY_TYPE,CONCAT_WS('@',CONCAT('`',SUBSTRING_INDEX(r.`definer`,'@',1),'`'),CONCAT('`',SUBSTRING_INDEX(r.`definer`,'@',-1),'`'))),
        '\n',
        r.ROUTINE_TYPE,
        CONCAT_WS('.', ROUTINE_SCHEMA, ROUTINE_NAME),
        CONCAT('(',GROUP_CONCAT(CONCAT_WS(' ', p.PARAMETER_NAME, p.DTD_IDENTIFIER)),')'),
        IF(o_p.DTD_IDENTIFIER is not null,CONCAT('RETURNS ',o_p.DTD_IDENTIFIER),''),
        ROUTINE_DEFINITION,
        '$$') stmt_

这     information_schema.routines r         LEFT JOIN     information_schema.parameters p ON p.SPECIFIC_SCHEMA = r.routine_schema         AND p.specific_name = r.routine_name         AND p.PARAMETER_MODE =' IN'         LEFT JOIN     information_schema.parameters o_p ON o_p.SPECIFIC_SCHEMA = r.routine_schema         AND o_p.specific_name = r.routine_name         AND o_p.PARAMETER_MODE为空 哪里     ROUTINE_SCHEMA IN(' _secured',' tester') GROUP BY CONCAT_WS('。',ROUTINE_SCHEMA,ROUTINE_NAME)