查看MySQL中的存储过程/函数定义


79

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

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


2
选择* FOM mysql.proc \ G;
zloctb

Answers:


121
SHOW CREATE PROCEDURE <name>

返回使用该CREATE PROCEDURE语句创建的先前定义的存储过程的文本。交换PROCEDUREFUNCTION获取存储的功能。


我正在#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 2014年

+1现在已经帮助了我3次。这些日子之一,我会铭记在心。
注册用户

3
除非Mysql被编译--with-debug,否则它将无法工作。因此,它不适用于AWS RDS实例。尝试显示创建过程“ xxxx”;如下面的@valli
ChrisR

39

您可以使用此:

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

8
不幸的是,ROUTINE_DEFINITION不包括存储过程的IN / OUT参数,也不包括返回值(而SHOW CREATE PROCEDURE则包括)。如果您想获取这些,则可以直接针对mysql.proc进行查询,例如SELECT param_list,returns,body from mysql.proc WHERE db ='yourdb'并且type ='PROCEDURE'和name ='procedurename';
GregW 2011年

@GregW该查询从mysql.proc返回的斑点param_listreturnsbody... ...我无法读取他们......你是怎么做到的呢?
德米特里·埃菲缅科


2
请注意,如果运行查询的用户不是DEFINER且安全性设置为DEFINER,则ROUTINE_DEFINITION将为null。如果将安全性设置为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;
Peter Brand

更正,即使将安全性设置为INVOKER,如果运行查询的用户与定义者也不相同,则定义将为null。
彼得·布兰德

10

如果要了解过程列表,可以运行以下命令-

show procedure status;

它会为您提供过程及其定义程序的列表,然后您可以运行 show create procedure <procedurename>;



7

您可以在数据库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' ;

5

就像是:

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'

3

如果您想获得所有产品的概述,或者遇到仅获得SHOW CREATE PROCEDURE所示的过程标头的问题,可以使用另一种快速而又棘手的解决方案:

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

它也将导出表描述,但不导出数据。非常适合嗅探未知或遗忘的架构...;)


-2

完美,尝试一下:

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

2
欢迎来到SE!请解释您的答案,尤其是关于它与其他现有答案有何区别的方面。
anderas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.