我想通过使用命令获取用于创建现有过程的代码
show create procedure
,然后将其存储在变量中。这一切都在一个程序内。
问题
Set @var
仅当结果包含一行和一列时,创建用户定义的变量才有效。show create procedure proc_name
返回多列,我无法选择特定的列Create Function
问题
如何将用于创建过程的代码保存到变量中以供以后使用。
我想通过使用命令获取用于创建现有过程的代码
show create procedure
,然后将其存储在变量中。这一切都在一个程序内。
Set @var
仅当结果包含一行和一列时,创建用户定义的变量才有效。show create procedure proc_name
返回多列,我无法选择特定的列Create Function
如何将用于创建过程的代码保存到变量中以供以后使用。
您可以使用 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 来帮助你。祝你好运。
下面的代码片段应该适用于大多数情况,我开始研究它希望它足够简单。但是有很多问题需要解决,也有例外。
我想使用 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)