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.


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.


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";

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


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>;


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' ;

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'

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 ...;)


-2

Perfecto, pruébalo:

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.