Ver la definición de función / procedimiento almacenado en MySQL

79

¿Cuál es el comando MySQL para ver la definición de un procedimiento o función almacenada, similar a sp_helptextMicrosoft SQL Server?

Sé que SHOW PROCEDURE STATUSmostrará la lista de los procedimientos disponibles. Necesito ver la definición de un solo procedimiento.

MV de Srinivas
fuente
2
SELECCIONAR * FOM mysql.proc \ G;
zloctb

Respuestas:

123
SHOW CREATE PROCEDURE <name>

Devuelve el texto de un procedimiento almacenado definido previamente que se creó utilizando la CREATE PROCEDUREdeclaración. Cambiar PROCEDUREpor FUNCTIONuna función almacenada.

afiliado
fuente
estoy recibiendo#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 Esto me ha ayudado tres veces ahora. Uno de estos días recordaré el mandato de memoria.
Usuario registrado
3
Esto no funcionará a menos que se haya compilado Mysql --with-debug. Por lo tanto, no funciona en instancias de AWS RDS. Intente mostrar el procedimiento de creación 'xxxx'; como @valli a continuación
ChrisR
39

Puedes usar esto:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Haim Evgi
fuente
9
Desafortunadamente, ROUTINE_DEFINITION no incluye los parámetros IN / OUT del procedimiento almacenado ni los valores de retorno (mientras que SHOW CREATE PROCEDURE sí). Si desea obtenerlos, puede consultar directamente contra mysql.proc, por ejemplo, SELECT param_list, returns, body FROM mysql.proc DONDE db = 'yourdb' AND type = 'PROCEDURE' and name = 'procedurename';
GregW
@GregW que consulta desde mysql.procdevuelve gotas para param_list, returnsy body... estoy incapaz de leerlos ... ¿Cómo lo hiciste?
Dmitry Efimenko
nvm, respuesta encontrada aquí
Dmitry Efimenko
2
Tenga en cuenta que ROUTINE_DEFINITION será nulo si el usuario que ejecuta la consulta no es el DEFINER y la seguridad está establecida en DEFINER. No tendrá ningún problema si la seguridad está configurada como INVOCADOR. También puede obtener los parámetros de 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
Corrección, incluso si la seguridad se establece en INVOCADOR, la definición será nula si el usuario que ejecuta la consulta no es el mismo que el definidor.
Peter Brand
10
SHOW CREATE PROCEDURE proc_name;

devuelve la definición de proc_name

Valli
fuente
Tampoco muestra el texto del procedimiento.
posfan12
Funciona para mi. Estoy usando AWS / RDS sin servidor. El texto de proceso muestra la columna Crear procedimiento.
KingAndrew hace
10

Si desea conocer la lista de procedimientos, puede ejecutar el siguiente comando:

show procedure status;

Le dará la lista de procedimientos y sus definidores. Luego puede ejecutar el show create procedure <procedurename>;

Sibashish Pujari
fuente
7

Puede usar la tabla proc en la base de datos mysql :

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

Tenga en cuenta que debe tener una concesión para seleccionar mysql.proc :

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

algo como:

DELIMITER //

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

DELIMITER ;

que:

SHOW CREATE PROCEDURE alluser

da resultado:

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

Una solución alternativa rápida y pirateada si desea obtener una descripción general de todos los productos que hay, o si se encuentra con el problema de obtener solo el encabezado del procedimiento que muestra SHOW CREATE PROCEDURE:

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

También exportará las descripciones de la tabla, pero no los datos. Funciona bien para husmear esquemas desconocidos u olvidados ...;)

ISparkes
fuente
-2

Perfecto, pruébalo:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Sumit
fuente
2
¡Bienvenido a SE! Por favor, explique su respuesta, especialmente en lo que respecta a lo que lo diferencia de los demás existentes.
anderas