Просмотр определения хранимой процедуры / функции в MySQL

79

Что представляет собой команда MySQL для просмотра определения хранимой процедуры или функции, как sp_helptextв Microsoft SQL Server?

Я знаю, что SHOW PROCEDURE STATUSотобразится список доступных процедур. Мне нужно увидеть определение одной процедуры.

Шринивас М.В.
источник
2
ВЫБЕРИТЕ * FOM mysql.proc \ G;
zloctb

Ответы:

123
SHOW CREATE PROCEDURE <name>

Возвращает текст ранее определенной хранимой процедуры, созданной с помощью CREATE PROCEDUREоператора. Заменить PROCEDUREна FUNCTIONсохраненную функцию.

филиал
источник
я получаю#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 Это помогло мне уже трижды. На днях запомню команду наизусть.
Зарегистрированный пользователь
3
Это не сработает, если Mysql не был скомпилирован --with-debug. Таким образом, это не работает на экземплярах AWS RDS. Попробуйте показать процедуру создания 'xxxx'; как @valli ниже
ChrisR
39

Вы можете использовать это:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Хаим Евги
источник
9
К сожалению, ROUTINE_DEFINITION не включает ни параметры IN / OUT хранимой процедуры, ни возвращаемые значения (в то время как SHOW CREATE PROCEDURE включает). Если вы хотите их получить, вы можете запросить прямо в mysql.proc, например, SELECT param_list, returns, body FROM mysql.proc WHERE db = 'yourdb' AND type = 'PROCEDURE' and name = 'procedurename';
GregW
@GregW, этот запрос mysql.procвозвращает капли для param_list, returnsи body... Я не могу их прочитать ... Как вы это сделали?
Дмитрий Ефименко
nvm, нашел ответ здесь
Дмитрий Ефименко
2
Имейте в виду, что ROUTINE_DEFINITION будет иметь значение NULL, если пользователь, выполняющий запрос, не является DEFINER, а безопасность установлена ​​на DEFINER. У вас не возникнет проблем, если безопасность установлена ​​на INVOKER. Вы также можете получить параметры от 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;
Питер Брэнд
Исправление, даже если для безопасности установлено значение INVOKER, определение будет нулевым, если пользователь, выполняющий запрос, не совпадает с определителем.
Питер Брэнд
10
SHOW CREATE PROCEDURE proc_name;

возвращает определение proc_name

Валли
источник
Здесь также не отображается текст процедуры.
posfan12 05
Работает на меня. Я использую AWS / RDS без сервера. Текст Proc отображается в столбце Create Procedure.
KingAndrew
10

Если вы хотите узнать список процедур, вы можете запустить следующую команду -

show procedure status;

Он предоставит вам список процедур и их определителей. Затем вы можете запустить show create procedure <procedurename>;

Сибашиш Пуджари
источник
7

Вы можете использовать table proc в базе данных mysql :

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

Обратите внимание, что у вас должен быть грант для выбора mysql.proc :

mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;
Омидреза Багери
источник
5

что-то вроде:

DELIMITER //

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

DELIMITER ;

чем:

SHOW CREATE PROCEDURE alluser

дает результат:

'alluser', 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER', 'CREATE DEFINER=`root`@`localhost` PROCEDURE `alluser`()
BEGIN
   SELECT *
   FROM users;
END'
Мишель
источник
3

Альтернативное быстрое и хитрое решение, если вы хотите получить обзор всех имеющихся продуктов или столкнуться с проблемой получения только заголовка процедуры, показанного SHOW CREATE PROCEDURE:

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

Он также экспортирует описания таблиц, но не данные. Хорошо работает для обнюхивания неизвестных или забытых схем ...;)

ISparkes
источник
-2

Отлично, попробуйте:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";
Сумит
источник
2
Добро пожаловать в SE! Пожалуйста, объясните свой ответ, особенно в отношении того, что отличает его от других существующих.
anderas