【问题标题】:View stored procedure/function definition in MySQL查看 MySQL 中的存储过程/函数定义
【发布时间】:2010-12-30 10:32:30
【问题描述】:

查看存储过程或函数定义的MySQL命令是什么,类似于Microsoft SQL Server中的sp_helptext

我知道SHOW PROCEDURE STATUS 将显示可用程序的列表。我需要查看单个过程的定义。

【问题讨论】:

  • SELECT * FOM mysql.proc\G;

标签: mysql stored-procedures stored-functions


【解决方案1】:
SHOW CREATE PROCEDURE <name>

返回使用CREATE PROCEDURE 语句创建的先前定义的存储过程的文本。将 PROCEDURE 替换为 FUNCTION 以获取存储函数。

【讨论】:

  • 我收到#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
  • +1 这已经帮了我三倍了。有一天,我会牢牢记住这个命令。
  • 这将不起作用,除非 Mysql 被编译 --with-debug。因此它不适用于 AWS RDS 实例。尝试显示创建过程'xxxx';正如下面的@valli
【解决方案2】:

你可以用这个:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";

【讨论】:

  • 不幸的是,ROUTINE_DEFINITION 不包括存储过程的 IN/OUT 参数,也不包括返回值(而 SHOW CREATE PROCEDURE 包含)。如果你想得到这些,你可以直接查询 mysql.proc,例如SELECT param_list,returns,body FROM mysql.proc WHERE db='yourdb' AND type='PROCEDURE' and name='procedurename';
  • @GregW 来自mysql.proc 的查询返回param_listreturnsbody 的blob...我无法阅读它们...你是怎么做到的?
  • nvm,找到答案here
  • 请注意,如果运行查询的用户不是 DEFINER 并且安全设置为 DEFINER,则 ROUTINE_DEFINITION 将为空。如果安全设置为 INVOKER,您将不会遇到问题。也可以从SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='$dbName' AND SPECIFIC_NAME=\"{$row['ROUTINE_NAME']}\" AND NOT PARAMETER_MODE IS NULL ORDER BY ORDINAL_POSITION;获取参数
  • 更正,即使安全设置为INVOKER,如果运行查询的用户与定义者不同,定义也会为空。
【解决方案3】:
SHOW CREATE PROCEDURE proc_name;

返回proc_name的定义

【讨论】:

  • 这也不显示过程的文本。
  • 为我工作。我正在使用 AWS/RDS 无服务器。 Proc 文本显示 Create Procedure 列。
【解决方案4】:

如果你想知道程序列表可以运行以下命令-

show procedure status;

它将为您提供程序列表及其定义器 然后你可以运行show create procedure &lt;procedurename&gt;;

【讨论】:

    【解决方案5】:

    您可以在数据库mysql中使用表proc

    mysql> SELECT body FROM mysql.proc
    WHERE db = 'yourdb' AND name = 'procedurename' ;
    

    请注意,您必须获得对 mysql.proc 的选择授权:

    mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;
    

    【讨论】:

    • 请注意,这不适用于 MySQL 8.0 版,请参阅bugs.mysql.com/bug.php?id=93814
    • 它以 BLOB 形式返回
    • @Hary 是的,你是对的。 “body”字段是 longblob,但输出显示为作为函数/存储过程定义的文本。
    【解决方案6】:

    类似:

    DELIMITER //
    
    CREATE PROCEDURE alluser()
    BEGIN
       SELECT *
       FROM users;
    END //
    
    DELIMITER ;
    

    比:

    SHOW CREATE PROCEDURE alluser
    

    给出结果:

    'alluser', 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER', 'CREATE DEFINER=`root`@`localhost` PROCEDURE `alluser`()
    BEGIN
       SELECT *
       FROM users;
    END'
    

    【讨论】:

      【解决方案7】:

      如果您想了解所有产品的概览,或者遇到仅获取 SHOW CREATE PROCEDURE 显示的过程标题的问题,另一种快速而简单的解决方案:

      mysqldump --user=<user> -p --no-data --routines <database>
      

      它也会导出表格描述,但不会导出数据。非常适合嗅探未知或被遗忘的模式... ;)

      【讨论】:

        【解决方案8】:

        完美,试试吧:

        SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
            WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
        

        【讨论】:

        • 欢迎来到 SE!请解释您的答案,特别是关于它与其他现有答案的区别。
        猜你喜欢
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多