Как вы отлаживаете хранимые процедуры MySQL?

Мой текущий процесс для отладки хранимых процедур очень прост. Я создаю таблицу под названием «debug», где я вставляю значения переменных из хранимой процедуры по мере ее запуска. Это позволяет мне увидеть значение любой переменной в данной точке скрипта, но есть ли лучший способ отладки хранимых процедур 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.

Бедный отладчик:

  1. Создайте таблицу под названием logtable с двумя столбцами, id INT и log VARCHAR(255) .

  2. Создайте автоинкремент id столбца.

  3. Используйте следующую процедуру:

     delimiter // DROP PROCEDURE `log_msg`// CREATE PROCEDURE `log_msg`(msg VARCHAR(255)) BEGIN insert into logtable select 0, msg; END 
  4. Поместите этот код в любом месте, где хотите записать сообщение в таблицу.

     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

Это альтернатива методам «вставки» и «регистрации». Ваш код не содержит дополнительных инструкций «отладки».

Скриншот:

ocelot breakpoint stepping

Первый и стабильный отладчик для 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.

Я использовал два разных инструмента для отладки процедур и функций:

  1. dbForge – много функциональный GUI mysql.
  2. 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 
  • Как установить значение составного поля переменных с помощью динамического SQL
  • Давайте будем гением компьютера.