我想通过使用该命令获取用于创建现有过程的代码
show create procedure
然后将其存储在变量中。所有这些都在程序中。
Set @var
仅在结果包含一行和一列时才有效。show create procedure proc_name
返回多列,我无法选择Create Function
如何将用于创建过程的代码保存到变量中以供以后使用。
答案 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)