Как вы отлаживаете хранимые процедуры MySQL?
Мой текущий процесс для отладки хранимых процедур очень прост. Я создаю таблицу под названием «debug», где я вставляю значения переменных из хранимой процедуры по мере ее запуска. Это позволяет мне увидеть значение любой переменной в данной точке скрипта, но есть ли лучший способ отладки хранимых процедур MySQL?
- Как запланировать хранимую процедуру в MySQL
- В чем разница между «AS» и «IS» в хранимой процедуре Oracle?
- EF не может вывести схему возврата из хранимой процедуры, выбрав из таблицы #temp
- Сохраненная процедура, которая автоматически удаляет строки старше 7 дней в MYSQL
- Триггеры MySQL не могут обновлять строки в той же таблице, которой назначен триггер. Предлагаемое решение?
- T-SQL получает значение SELECTed хранимой процедуры
- использование хранимой процедуры в структуре сущностей
- Обработка ошибок хранимой процедуры MySQL
Я делаю что-то очень похожее на вас.
Обычно я включаю параметр DEBUG, который по умолчанию имеет значение false, и я могу установить значение true во время выполнения. Затем заверните операторы отладки в блок «Если DEBUG».
Я также использую таблицу протоколирования со многими моими заданиями, чтобы я мог просматривать процессы и время. Мой отладочный код также выводится. Я включаю имя вызывающего пара, краткое описание, количество строк, затронутых (если необходимо), поле комментариев и отметку времени.
Хорошие инструменты отладки – одна из печальных ошибок всех платформ SQL.
Можно debug_msg
следующую процедуру debug_msg
чтобы просто вывести на консоль сообщение об отладке:
DELIMITER $$ DROP PROCEDURE IF EXISTS `debug_msg`$$ DROP PROCEDURE IF EXISTS `test_procedure`$$ CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255)) BEGIN IF enabled THEN BEGIN select concat("** ", msg) AS '** DEBUG:'; END; END IF; END $$ CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER) BEGIN SET @enabled = TRUE; call debug_msg(@enabled, "my first debug message"); call debug_msg(@enabled, (select concat_ws('',"arg1:", arg1))); call debug_msg(TRUE, "This message always shows up"); call debug_msg(FALSE, "This message will never show up"); END $$ DELIMITER ;
Затем запустите тест следующим образом:
CALL test_procedure(1,2)
Это приведет к следующему результату:
** DEBUG: ** my first debug message ** DEBUG: ** arg1:1 ** DEBUG: ** This message always shows up
Да, есть специальные инструменты для такого рода вещей – MySQL Debugger .
Существуют инструменты GUI для отладки хранимых процедур / функций и скриптов в MySQL. Достойный инструмент, который dbForge Studio для MySQL, обладает богатой функциональностью и стабильностью.
Как отлаживать хранимую процедуру MySQL.
Бедный отладчик:
-
Создайте таблицу под названием logtable с двумя столбцами,
id INT
иlog VARCHAR(255)
. -
Создайте автоинкремент id столбца.
-
Используйте следующую процедуру:
delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END
-
Поместите этот код в любом месте, где хотите записать сообщение в таблицу.
call log_msg(concat('myvar is: ', myvar, ' and myvar2 is: ', myvar2));
Это хороший быстрый и грязный логгер, чтобы выяснить, что происходит.
Здесь представлен еще один способ
http://gilfster.blogspot.co.at/2006/03/debugging-stored-procedures-in-mysql.html
с пользовательскими отладчиками mySql-процедур и протоколированием таблиц.
Вы также можете просто поместить простой код в свой код и посмотреть, выполняется ли он.
SELECT 'Message Text' AS `Title`;
Я получил эту идею от
http://forums.mysql.com/read.php?99,78155,78225#msg-78225
Также кто-то создал шаблон для пользовательских процедур отладки в GitHub.
Глянь сюда
http://www.bluegecko.net/mysql/debugging-stored-procedures/ https://github.com/CaptTofu/Stored-procedure-debugging-routines
Был упомянут здесь
Как поймать любое исключение в триггерах и хранить процедуры для mysql?
Отладчик для mysql был хорош, но он не был бесплатным. Это то, что я использую сейчас:
DELIMITER GO$ DROP PROCEDURE IF EXISTS resetLog GO$ Create Procedure resetLog() BEGIN create table if not exists log (ts timestamp default current_timestamp, msg varchar(2048)) engine = myisam; truncate table log; END; GO$ DROP PROCEDURE IF EXISTS doLog GO$ Create Procedure doLog(in logMsg nvarchar(2048)) BEGIN insert into log (msg) values(logMsg); END; GO$
Использование в хранимой процедуре:
call dolog(concat_ws(': ','@simple_term_taxonomy_id', @simple_term_taxonomy_id));
использование хранимой процедуры:
call resetLog (); call stored_proc(); select * from log;
Я просто просто размещаю инструкции выбора в ключевых областях хранимой процедуры, чтобы проверить текущее состояние наборов данных, а затем прокомментировать их (- select …) или удалить их перед производством.
MySQL Connector / Net 6.6 имеет функцию отладки хранимых процедур и функций
Установка отладчика
Чтобы включить отладчик хранимой процедуры:
- Для соединителя / сети 6.6: установите соединитель / сеть 6.6 и выберите вариант «Полный».
- Для Connector / Net 6.7 и более поздних версий: установите продукт MySQL для Visual Studio, к которому принадлежит отладчик хранимой процедуры.
Запуск отладчика
Чтобы запустить отладчик, выполните следующие действия:
- Выберите соединение в Visual Studio Server Explorer.
- Разверните папку Хранимые процедуры. Только хранимые процедуры можно отлаживать напрямую. Чтобы отладить пользовательскую функцию, создайте сохраненную
процедура, вызывающая функцию.- Нажмите на узел хранимой процедуры, затем щелкните правой кнопкой мыши и в контекстном меню выберите Debug Routine.
Я опоздал на вечеринку, но принес больше пива:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ и https://github.com/ocelot-inc/ocelotgui
Я попытался, и он кажется довольно стабильным, поддерживая проверку точек останова и переменных.
Это не полный набор (всего 4,1 Мб), но мне очень помог!
Как это работает: он интегрируется с вашим клиентом mysql (я использую Ubuntu 14.04) и после выполнения:
$install $setup yourFunctionName
Он устанавливает новую базу данных на вашем сервере, которая контролирует процесс отладки. Так:
$debug yourFunctionName('yourParameter')
даст вам шанс шаг за шагом пройти ваш код и «обновить» ваши переменные, вы можете лучше просмотреть, что происходит внутри вашего кода.
Важный совет: во время отладки, возможно, вы измените (заново создайте процедуру). После повторного создания выполните: $ exit и $ setup перед новым $ debug
Это альтернатива методам «вставки» и «регистрации». Ваш код не содержит дополнительных инструкций «отладки».
Скриншот:
Первый и стабильный отладчик для MySQL находится в dbForge Studio for MySQL
MySql Connector / NET также включает отладчик хранимых процедур, интегрированный в visual studio с версии 6.6, вы можете получить установщик и источник здесь: http://dev.mysql.com/downloads/connector/net/
Некоторые документы / скриншоты: https://dev.mysql.com/doc/visual-studio/en/visual-studio-debugger.html
Вы можете следить за аннуитетами здесь: http://forums.mysql.com/read.php?38,561817,561817#msg-561817
UPDATE: MySql для Visual Studio был разделен на Connector / NET на отдельный продукт, вы можете выбрать его (включая отладчик) здесь https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (все еще бесплатно и с открытым исходным кодом).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я был разработчиком, который создал механизм отладки хранимых процедур для продукта MySQL для Visual Studio.
Я использовал два разных инструмента для отладки процедур и функций:
- dbForge – много функциональный GUI mysql.
- MyDebugger – специализированный инструмент для отладки … удобный инструмент для отладки. голосовать http://tinyurl.com/voteimg
Жаба mysql. Существует бесплатная версия http://www.quest.com/toad-for-mysql/
Ответ, соответствующий этому @Brad Parks Не уверен в версии MySQL, но мой был 5.6, следовательно, немного настраивается:
Я создал функцию debug_msg
которая является функцией (а не процедурой) и возвращает текст (без ограничения символа), а затем вызывает функцию как SELECT debug_msg
(params) AS my_res_set
, код, как my_res_set
ниже:
CREATE DEFINER=`root`@`localhost` FUNCTION `debug_msg`(`enabled` INT(11), `msg` TEXT) RETURNS text CHARSET latin1 READS SQL DATA BEGIN IF enabled=1 THEN return concat('** DEBUG:', "** ", msg); END IF; END DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_func_call`( IN RegionID VARCHAR(20), IN RepCurrency INT(11), IN MGID INT(11), IN VNC VARCHAR(255) ) BEGIN SET @enabled = TRUE; SET @mainQuery = "SELECT * FROM Users u"; SELECT `debug_msg`(@enabled, @mainQuery) AS `debug_msg1`; SET @lastQuery = CONCAT(@mainQuery, " WHERE u.age>30); SELECT `debug_msg`(@enabled, @lastQuery) AS `debug_msg2`; END $$ DELIMITER