106

What is the MySQL command to show the definition of a procedure, similar to sp_helptext in Microsoft SQL Server?

I know that SHOW PROCEDURE STATUS will display the list of the procedures available. I need to see a single procedure's definition.

1
  • 3
    SELECT * FOM mysql.proc\G; Commented Mar 27, 2016 at 15:24

10 Answers 10

163
SHOW CREATE PROCEDURE <name> 

Returns the text of a previously defined stored procedure that was created using the CREATE PROCEDURE statement. Swap PROCEDURE for FUNCTION for a stored function.

Sign up to request clarification or add additional context in comments.

3 Comments

i am getting #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 This has helped me three times now. One of these days I will remember the command by heart.
This will not work unless Mysql was compiled --with-debug. So it does not work on AWS RDS instances. Try show create procedure 'xxxx'; as @valli below
45

You can use this:

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

7 Comments

Unfortunately the ROUTINE_DEFINITION does not include the IN/OUT parameters of the stored procedure nor the return values (while SHOW CREATE PROCEDURE does). If you want to get those, you can query straight against mysql.proc, e.g. SELECT param_list,returns,body FROM mysql.proc WHERE db='yourdb' AND type='PROCEDURE' and name='procedurename';
@GregW that query from mysql.proc returns blobs for param_list, returns, and body... I'm unable to read them... How did you do it?
nvm, found answer here
Be aware the ROUTINE_DEFINITION will be null if the user running the query is not the DEFINER and the security is set to DEFINER. You won't have a problem if security is set to INVOKER. You can also get the parameters from 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;
Correction, even if security is set to INVOKER, the definition will be null if the user running the query is not the same as the definer.
|
16
SHOW CREATE PROCEDURE proc_name; 

returns the definition of proc_name

2 Comments

This does not show the text of the procedure either.
Works for me. I'm using AWS/RDS serverless. Proc text shows up the the Create Procedure column.
11

If you want to know the list of procedures you can run the following command -

show procedure status; 

It will give you the list of procedures and their definers Then you can run the show create procedure <procedurename>;

Comments

9

You can use table proc in database mysql:

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

Note that you must have a grant for select to mysql.proc:

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

3 Comments

Please note that this does not work with MySQL version 8.0, see bugs.mysql.com/bug.php?id=93814
It's returning as BLOB
@Hary Yes, you're right. The 'body' field is longblob, but the output is displayed as text that is the function/store procedure definition.
5

something like:

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

than:

SHOW CREATE PROCEDURE alluser 

gives result:

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

Comments

5

An alternative quick and hacky solution if you want to get an overview of all the produres there are, or run into the issue of only getting the procedure header shown by SHOW CREATE PROCEDURE:

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

It will export the table descriptions as well, but no data. Works well for sniffing around unknown or forgotten schemas... ;)

Comments

2

You can show the CREATE PROCEDURE statement with the SQL below. *The doc explains the SQL below and \G can show it more clearly and you must select a database when showing the CREATE PROCEDURE statement otherwise there is the error:

SHOW CREATE PROCEDURE <procedure_name>; 

Or:

SHOW CREATE PROCEDURE <procedure_name>\G 

Comments

0

if you need view/modify procedure using MYSQL workbench GUI you can do it this way

enter image description here

as shown above you can copy or send to editor direct, or alter and drop it.

Comments

-2

Perfect, try it:

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

1 Comment

Welcome to SE! Please explain your answer, especially with regards to what differentiates it from the other existing ones.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.