Zeigen Sie die Definition der gespeicherten Prozedur / Funktion in MySQL an


79

Was ist der MySQL-Befehl, um die Definition einer gespeicherten Prozedur oder Funktion anzuzeigen, ähnlich wie sp_helptextin Microsoft SQL Server?

Ich weiß, dass SHOW PROCEDURE STATUSdie Liste der verfügbaren Verfahren angezeigt wird. Ich muss die Definition einer einzelnen Prozedur sehen.


2
SELECT * FOM mysql.proc \ G;
Zloctb

Antworten:


122
SHOW CREATE PROCEDURE <name>

Gibt den Text einer zuvor definierten gespeicherten Prozedur zurück, die mit der CREATE PROCEDUREAnweisung erstellt wurde. Tauschen Sie PROCEDUREgegen FUNCTIONfür eine gespeicherte Funktion.


Ich bekomme#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 Das hat mir jetzt dreimal geholfen. Eines Tages werde ich mich auswendig an den Befehl erinnern.
Registrierter Benutzer

3
Dies funktioniert nur, wenn MySQL kompiliert wurde - mit Debug. Daher funktioniert es nicht auf AWS RDS-Instanzen. Versuchen Sie show create procedure 'xxxx'; als @valli unten
ChrisR

39

Sie können dies verwenden:

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

9
Leider enthält die ROUTINE_DEFINITION weder die IN / OUT-Parameter der gespeicherten Prozedur noch die Rückgabewerte (während SHOW CREATE PROCEDURE dies tut). Wenn Sie diese erhalten möchten, können Sie direkt nach mysql.proc abfragen, z. B. SELECT param_list, return, body FROM mysql.proc WHERE db = 'yourdb' AND type = 'PROCEDURE' und name = 'procedureurename';
GregW

@ GregW diese Abfrage von mysql.procgibt Blobs für zurück param_list, returnsund body... ich kann sie nicht lesen ... Wie haben Sie das gemacht?
Dmitry Efimenko


2
Beachten Sie, dass ROUTINE_DEFINITION null ist, wenn der Benutzer, der die Abfrage ausführt, nicht DEFINER ist und die Sicherheit auf DEFINER festgelegt ist. Sie haben kein Problem, wenn die Sicherheit auf INVOKER eingestellt ist. Sie können die Parameter auch von 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

Korrektur, selbst wenn die Sicherheit auf INVOKER gesetzt ist, ist die Definition null, wenn der Benutzer, der die Abfrage ausführt, nicht mit dem Definierer identisch ist.
Peter Brand

10

Wenn Sie die Liste der Prozeduren kennen möchten, können Sie den folgenden Befehl ausführen:

show procedure status;

Es gibt Ihnen die Liste der Prozeduren und ihrer Definierer. Dann können Sie die ausführen show create procedure <procedurename>;


9
SHOW CREATE PROCEDURE proc_name;

gibt die Definition von zurück proc_name


Dies zeigt auch nicht den Text der Prozedur.
Posfan12

7

Sie können die Tabelle proc in der Datenbank mysql verwenden :

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

Beachten Sie, dass Sie einen Zuschuss für die Auswahl von mysql.proc benötigen :

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

5

etwas wie:

DELIMITER //

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

DELIMITER ;

als:

SHOW CREATE PROCEDURE alluser

gibt Ergebnis:

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

3

Eine alternative schnelle und hackige Lösung, wenn Sie sich einen Überblick über alle verfügbaren Produkte verschaffen möchten oder nur den von SHOW CREATE PROCEDURE angezeigten Prozedur-Header erhalten möchten:

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

Es werden auch die Tabellenbeschreibungen exportiert, jedoch keine Daten. Funktioniert gut zum Schnüffeln in unbekannten oder vergessenen Schemata ...;)


-2

Perfekt, probieren Sie es aus:

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

2
Willkommen bei SE! Bitte erläutern Sie Ihre Antwort, insbesondere im Hinblick darauf, was sie von den anderen vorhandenen unterscheidet.
anderas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.