显示MySQL命令行的过程/函数

511
如何在mysql命令行中查看存储过程或存储函数的列表,就像使用SHOW TABLES;SHOW DATABASES;命令一样。
20个回答

784
SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;

2
有没有一种方法可以找到当前存储过程的名称?我相信在SSMS中是 object_name(@@procid),MySql中是否有类似的东西? - Zameer Ansari
1
如果用户拥有“EXECUTE”权限,则显示列表,否则将显示空列表。 - mjb

222
show procedure status

会显示存储过程。

show create procedure MY_PROC

这会向您展示一个过程的定义。并且

help show

将为您显示show命令的所有可用选项。


1
正如Codler所指出的那样,help show不起作用,因为help是一个mysql命令行指令。要获取有关SHOW命令的更多信息,请直接访问MySQL文档页面:http://dev.mysql.com/doc/refman/5.1/en/show.html - IvanD
2
嗯,我不确定你为什么这么说,但在我的CentOS 6.3上使用MySQL 5.0.95,帮助展示工作得很好。 - h4unt3r
如果您使用MySQL自己的命令行客户端,它可以工作。但我不使用,所以我更喜欢在线参考。 - Ledhund
这是最好的答案。 - Kellen Stuart

105

按名称查看过程

select name from mysql.proc 

以下代码用于列出所有存储过程,该代码提供与“show procedure status”相同的结果。

select * from mysql.proc 

7
如果你使用较小的终端,这个演示比其他演示更加清晰易懂。谢谢。 - user1527227
我将这个答案进化成了select db,name,type from mysql.proc where db<>'sys';,以获取更多信息,减少内置系统垃圾。 - pbnelson

53

更具体的方法:

SHOW PROCEDURE STATUS 
WHERE Db = DATABASE() AND Type = 'PROCEDURE'

4
即使不使用“AND Type ='PROCEDURE'”也可以工作。 - normalUser
“Type” 过滤器非常方便,如果您有不想看到的函数。 - 5422m4n

39

如上所述,

show procedure status;

这确实会显示一份存储过程列表,但会展示服务器范围内的所有存储过程。

如果你只想查看单个数据库中的存储过程,请尝试以下方法:

SHOW PROCEDURE STATUS WHERE Db = 'databasename';

同样地,SHOW FUNCTION STATUS WHERE Db = 'databasename'; 带给你函数。 - David A. Gray

32

替代方案:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

24

我偏爱以下特点的工具:

  1. 列出函数和过程
  2. 明确标注它们的类型
  3. 只展示过程的名称和类型, 不包括其他信息
  4. 根据当前数据库进行结果筛选, 而非当前定义者
  5. 结果排序

从该主题的其他回答中整合而来。

select 
  name, type 
from 
  mysql.proc 
where 
  db = database() 
order by 
  type, name;

...这将使结果看起来像这样:

mysql> select name, type from mysql.proc where db = database() order by type, name;
+------------------------------+-----------+
| name                         | type      |
+------------------------------+-----------+
| get_oldest_to_scan           | FUNCTION  |
| get_language_prevalence      | PROCEDURE |
| get_top_repos_by_user        | PROCEDURE |
| get_user_language_prevalence | PROCEDURE |
+------------------------------+-----------+
4 rows in set (0.30 sec)

18

显示所有存储过程:

SHOW PROCEDURE STATUS;

显示所有函数:

SHOW FUNCTION STATUS;

显示指定过程的定义:

SHOW CREATE PROCEDURE [PROC_NAME];

显示给定数据库的所有过程:

SHOW PROCEDURE STATUS WHERE Db = '[db_name]';

15

使用这个:

SHOW PROCEDURE STATUS;

9
Praveenkumar_V的帖子有一个变化版本:
SELECT `name` FROM mysql.proc WHERE db = 'dbname' AND `type` = 'PROCEDURE';
SELECT `name` FROM mysql.proc WHERE db = 'dbname' AND `type` = 'FUNCTION';

这是因为我在做一些日常清理之后需要节省时间:

SELECT CONCAT(
     "GRANT EXECUTE ON PROCEDURE `"
    ,`name`
    ,"` TO username@'%'; -- "
    ,`comment`
)
FROM mysql.proc
WHERE db = 'dbname'
AND `type` = 'PROCEDURE';

SELECT CONCAT(
     "GRANT EXECUTE ON FUNCTION `"
    ,`name`
    ,"` TO username@'%'; -- "
    ,`comment`
)
FROM mysql.proc
WHERE db = 'dbname'
AND `type` = 'FUNCTION';

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