【问题标题】:Store the result of `show create procedure procedure_name` into a variable in MySql将`show create procedure procedure_name`的结果存储到MySql中的一个变量中
【发布时间】:2012-04-12 09:34:19
【问题描述】:

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

问题

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

问题

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

【问题讨论】:

  • 为什么需要它?您可以在应用程序中轻松完成。

标签: mysql stored-procedures


【解决方案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 来帮助你。祝你好运。

【讨论】:

  • select routine definitionshow create procedure 之间存在差异。我想要用于创建过程的实际代码,而不是过程本身。
  • @tombom 还有过程参数等选项。
  • @cWoDeR 再次更新了我的答案。
  • @tombom 我实际上不明白为什么 cWoDeR 想要这样做。我会在应用程序中这样做。还有一点——这个问题可能是数据库设计不好的结果。
  • @Devart 其实我也不知道。简直无法想象为什么会有人需要它。
【解决方案2】:

下面的 sn-p 应该适用于大多数情况,我开始研究它希望它足够简单。 但是有很多问题需要解决,也有例外。

我想使用 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 左连接 information_schema.parameters p ON p.SPECIFIC_SCHEMA = r.routine_schema AND p.specific_name = r.routine_name 和 p.PARAMETER_MODE = 'IN' 左连接 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 为 NULL 在哪里 ROUTINE_SCHEMA IN ('_secured' , 'tester') GROUP BY CONCAT_WS('.', ROUTINE_SCHEMA, ROUTINE_NAME)

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2015-06-11
    • 2019-12-29
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多