在MySQL中显示过程定义

98
MySQL中显示存储过程定义的命令是什么,类似于Microsoft SQL Server中的sp_helptext
我知道SHOW PROCEDURE STATUS会显示可用存储过程的列表。但我需要查看单个存储过程的定义。

3
SELECT * FROM mysql.proc\G;(查询mysql数据库中的proc表格并以基于行的格式显示) - zloctb
10个回答

151
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 的错误提示。 - Govind Singh
+1 这已经帮了我三次了。总有一天我会记住这个命令的。 - Registered User
4
如果未使用--with-debug编译Mysql,则此方法无效。因此,在AWS RDS实例上无法使用。请尝试执行"show create procedure 'xxxx';",如下所示@valli。 - ChrisR

44

你可以使用这个:

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

10
很遗憾,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
@GregW,mysql.proc查询返回的是param_listreturnsbody的二进制数据...我无法读取它们...你是如何做到的? - Dmitry Efimenko
nvm,在这里找到答案:https://dev59.com/rnNA5IYBdhLWcg3wdtv5 - Dmitry Efimenko
2
请注意,如果运行查询的用户不是定义者并且安全设置为定义者,则ROUTINE_DEFINITION将为空。如果安全设置为调用者,则不会有问题。您还可以从以下语句中获取参数: 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; - Peter Brand
即使将安全性设置为INVOKER,如果运行查询的用户与定义者不同,则该定义将为空。 - Peter Brand
@GregW mysql 8中不包含mysq.proc表。有什么办法可以在mysql 8上获取完整的定义吗? - Nasik Ahd

16
SHOW CREATE PROCEDURE proc_name;

返回proc_name的定义。


1
这也不显示过程的文本。 - posfan12
对我来说可以运行。我正在使用AWS/RDS无服务器。Proc文本显示在Create Procedure列中。 - KingAndrew

11

如果想知道可以运行的过程列表,请运行以下命令 -

show procedure status;

这将给你一个存储过程及其定义者的列表, 然后你可以运行 show create procedure <procedurename>;


8
您可以在数据库MySQL中使用表格 proc:
mysql> SELECT body FROM mysql.proc
WHERE db = 'yourdb' AND name = 'procedurename' ;

请注意,您必须授予对 mysql.proc 的 select 权限:
mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;

2
请注意,此方法不适用于MySQL 8.0版本,请参见bugs.mysql.com/bug.php?id=93814 - Víctor Gil
它返回为BLOB。 - Hary
1
@Hary 是的,你说得对。'body'字段是longblob类型,但输出显示为文本,即函数/存储过程定义。 - Omidreza Bagheri

5

something like:

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'

5

如果您想概览所有存储过程,或者遇到仅显示存储过程头部的问题,并且需要快速而简单的解决方案,则可以采用另一种快速而不太正式的方法:

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

它会导出表的描述,但不包括数据。非常适用于查找未知或被遗忘的模式... ;)


0
你可以使用下面的SQL语句显示CREATE PROCEDURE语句。*文档解释了下面的SQL语句,而\G可以更清晰地显示它,当显示CREATE PROCEDURE语句时,你必须选择一个数据库,否则会出现错误
SHOW CREATE PROCEDURE <procudure_name>;

或者:

SHOW CREATE PROCEDURE <procudure_name>\G

0
如果你需要使用MYSQL workbench图形界面来查看/修改过程,你可以这样做。

enter image description here

如上所示,您可以直接复制或发送给编辑,或者进行修改和删除。

-2

太好了,试试看:

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

3
欢迎来到SE!请解释您的答案,特别是涉及到与现有答案不同之处。 - anderas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接