1

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

问题

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

问题

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

4

2 回答 2

3

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

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

有关更多信息,请参阅此链接。

更新:

然后,您将不得不自己构建它。没有别的办法。

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 中添加的

有关更多信息,请查看此处。

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

于 2012-04-12T09:55:05.000 回答
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_

FROM 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)

于 2016-11-07T09:00:16.473 回答