Как вы отлаживаете хранимые процедуры MySQL?
мой текущий процесс отладки хранимых процедур очень прост. Я создаю таблицу под названием "debug", где я вставляю значения переменных из хранимой процедуры по мере ее выполнения. Это позволяет мне видеть значение любой переменной в данной точке скрипта, но есть ли лучший способ отладки хранимых процедур MySQL?
15 ответов
Я делаю что-то очень похожее на вас.
обычно я включаю параметр отладки, который по умолчанию равен false, и я могу установить true во время выполнения. Затем оберните операторы отладки в блок "if DEBUG".
Я также использую таблицу журналов со многими моими заданиями, чтобы я мог просматривать процессы и сроки. Мой код отладки также выводится там. Я включаю имя вызывающего параметра, краткое описание, количество затронутых строк (если это необходимо), поле комментариев и время печать.
хорошие инструменты отладки - один из печальных недостатков всех платформ SQL.
следующее 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)
.сделайте столбец идентификатора autoincrement.
-
используйте эту процедуру:
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 в ключевые области хранимой процедуры для проверки текущего состояния наборов данных, а затем комментирую их (--select...) или удалить их перед производством.
MySQL Connector / Net 6.6 имеет функцию отладка хранимых процедур и функций
установка отладчика
включить отладчик хранимых процедур:
- для соединителя / сети 6.6: установите соединитель / сеть 6.6 и выберите полный вариант.
- для Connector / Net 6.7 и более поздних версий: установите продукт MySQL для Visual Studio, к которому относится отладчик хранимых процедур принадлежать.
запуск отладчика
чтобы запустить отладчик, выполните следующие действия:
- выберите соединение в Обозревателе серверов Visual Studio.
- разверните папку хранимые процедуры. Только хранимые процедуры можно отлаживать напрямую. Чтобы отладить пользовательскую функцию, создайте хранимую
процедура, вызывающая функцию.- нажмите на узел хранимой процедуры, затем щелкните правой кнопкой мыши и в контекстном меню выберите команду отладка.
Я опоздал на вечеринку, но принес еще пива:
http://ocelot.ca/blog/blog/2015/03/02/the-ocelotgui-debugger/ и https://github.com/ocelot-inc/ocelotgui
Я пробовал, и это кажется довольно стабильным, поддерживая точки останова и переменную проверку.
это не полный набор (всего 4,1 Mb), но мне очень помогло!
Как это работает: Он интегрируется с вашим клиентом mysql (я использую Ubuntu 14.04), и после вас выполнить:
$install
$setup yourFunctionName
Он устанавливает новую базу данных на вашем сервере, которая контролирует процесс отладки. Итак:
$debug yourFunctionName('yourParameter')
даст вам возможность шаг за шагом пройти свой код, и "освежать" свои переменные вы можете лучше видеть, что происходит внутри вашего кода.
важный совет: во время отладки, возможно, вы измените (повторно создайте процедуру). После повторного создания выполните: $exit и $setup перед Новым $debug
Это альтернатива методам" insert "и" log". Ваш код остается свободным от дополнительных инструкций "отладки".
скриншоты:
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
вы можете следовать annoucements здесь: 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-много функциональных MySQL GUI.
- MyDebugger-специализированный инструмент для отладки ... удобный инструмент для отладки.голосовать http://tinyurl.com/voteimg
жаба mysql. Существует бесплатная версия http://www.quest.com/toad-for-mysql/
ответ, соответствующий этой by @Brad Parks Не уверен в версии MySQL, но моя была 5.6, поэтому немного работает настройка:
Я создал функцию debug_msg
который является функцией (не процедурой) и возвращает текст(без ограничения символов), а затем вызывает функцию как SELECT debug_msg
(params) AS 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