Wyświetl definicję procedury składowanej / funkcji w MySQL

79

Jakie polecenie MySQL umożliwia wyświetlenie definicji procedury składowanej lub funkcji, podobnie jak sp_helptextw programie Microsoft SQL Server?

Wiem, że SHOW PROCEDURE STATUSwyświetli się lista dostępnych procedur. Muszę zobaczyć definicję pojedynczej procedury.

Srinivas MV
źródło
2
SELECT * FOM mysql.proc \ G;
zloctb

Odpowiedzi:

123
SHOW CREATE PROCEDURE <name>

Zwraca tekst wcześniej zdefiniowanej procedury składowanej, która została utworzona przy użyciu CREATE PROCEDUREinstrukcji. Zamień PROCEDUREna FUNCTIONzapisaną funkcję.

afftee
źródło
dostaję#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 Pomogło mi to już trzy razy. Któregoś dnia zapamiętam polecenie na pamięć.
Zarejestrowany użytkownik
3
To nie zadziała, jeśli Mysql nie zostanie skompilowany --with-debug. Więc nie działa w instancjach AWS RDS. Spróbuj pokazać procedurę tworzenia „xxxx”; jak @valli poniżej
ChrisR
39

Możesz użyć tego:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Haim Evgi
źródło
9
Niestety ROUTINE_DEFINITION nie zawiera parametrów IN / OUT procedury składowanej ani wartości zwracanych (podczas gdy funkcja SHOW CREATE PROCEDURE nie zawiera). Jeśli chcesz je uzyskać, możesz zapytać bezpośrednio o mysql.proc, np. SELECT param_list, return, body FROM mysql.proc WHERE db = 'yourdb' AND type = 'PROCEDURE' and name = 'procedurename';
GregW,
@GregW to zapytanie z mysql.proczwraca obiekty blob dla param_list, returnsi body... Nie mogę ich odczytać ... Jak to zrobiłeś?
Dmitry Efimenko
nvm, znalazłem odpowiedź tutaj
Dmitry Efimenko
2
Należy pamiętać, że ROUTINE_DEFINITION będzie zerowa, jeśli użytkownik uruchamiający zapytanie nie jest DEFINEREM, a zabezpieczenie jest ustawione na DEFINER. Nie będziesz mieć problemu, jeśli ustawisz zabezpieczenia na INVOKER. Możesz również pobrać parametry z 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,
Korekta, nawet jeśli zabezpieczenie jest ustawione na INVOKER, definicja będzie zerowa, jeśli użytkownik uruchamiający zapytanie nie jest tym samym, co definiujący.
Peter Brand
10
SHOW CREATE PROCEDURE proc_name;

zwraca definicję proc_name

Valli
źródło
To również nie pokazuje tekstu procedury.
posfan12
Pracuje dla mnie. Używam AWS / RDS serverless. Tekst proc pojawia się w kolumnie Create Procedure.
KingAndrew
10

Jeśli chcesz poznać listę procedur, możesz uruchomić następujące polecenie -

show procedure status;

Wyświetli listę procedur i ich definicji. Następnie możesz uruchomić plik show create procedure <procedurename>;

Sibashish Pujari
źródło
7

Możesz użyć table proc w bazie danych mysql :

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

Pamiętaj, że musisz mieć pozwolenie na wybór dla mysql.proc :

mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;
Omidreza Bagheri
źródło
5

coś jak:

DELIMITER //

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

DELIMITER ;

niż:

SHOW CREATE PROCEDURE alluser

daje wynik:

'alluser', 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER', 'CREATE DEFINER=`root`@`localhost` PROCEDURE `alluser`()
BEGIN
   SELECT *
   FROM users;
END'
Michel
źródło
3

Alternatywne szybkie i hakerskie rozwiązanie, jeśli chcesz uzyskać przegląd wszystkich dostępnych produktów lub napotkać problem z pobieraniem tylko nagłówka procedury pokazanego przez POKAŻ PROCEDURĘ TWORZENIA:

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

Wyeksportuje również opisy tabel, ale bez danych. Działa dobrze przy węszeniu nieznanych lub zapomnianych schematów ...;)

ISparkes
źródło
-2

Idealnie, spróbuj:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Sumit
źródło
2
Witamy w SE! Proszę wyjaśnij swoją odpowiedź, szczególnie w odniesieniu do tego, co ją odróżnia od innych istniejących.
anderas