Мой текущий процесс отладки хранимых процедур очень прост. Я создаю таблицу под названием «отладка», в которую вставляю значения переменных из хранимой процедуры по мере ее выполнения. Это позволяет мне видеть значение любой переменной в заданном месте сценария, но есть ли лучший способ отладки хранимых процедур MySQL?






Я просто помещаю операторы выбора в ключевые области хранимой процедуры, чтобы проверить текущее состояние наборов данных, а затем закомментировать их (--select ...) или удалить их перед производством.
Да, я поступаю точно так же. Я помещаю оператор выбора и проверяю состояние таблиц и связанных значений. Иногда я использую временную таблицу для вставки значений в таблицы, и как только решение найдено, я удаляю временные таблицы и эти операторы выбора.
Я делаю что-то очень похожее на тебя.
Обычно я включаю параметр DEBUG, который по умолчанию имеет значение false, и я могу установить значение true во время выполнения. Затем оберните операторы отладки в блок «If DEBUG».
Я также использую таблицу регистрации для многих своих заданий, чтобы я мог просматривать процессы и сроки. Там же выводится мой код отладки. Я включаю имя вызывающего параметра, краткое описание, количество затронутых строк (при необходимости), поле комментариев и отметку времени.
Хорошие инструменты отладки - один из печальных недостатков всех платформ SQL.
Не все платформы @Bob Probst, инструменты отладки sybase вполне приличны с отладкой точки останова для триггера и хранимых процедур.
Да, для этого есть специализированные инструменты - Отладчик MySQL.
я так хотел попробовать. К сожалению, это полный обломки. Я получаю сообщение об ошибке «функция объединения не существует» предположительно от mysql, в результате чего графический интерфейс неправильно разветвляется через код SP (хотя MySQL выполняет его правильно). Не говоря уже о локальных переменных "DECLARE var DEFAULT value". Они просто отображаются как NULL, когда это явно не так. Да, а также «Необъявленный идентификатор: 'FETCH_RADIUS_DISTSORT'», где это был скомпилированный оператор. Не рекомендуется.
Это не идеально, но мое испытание с этим было совсем другим, чем описанное выше @kellogs. Инструмент красивый и легкий, и кажется, что он выполняет всю необходимую работу без лишних усилий. Для меня это был гораздо лучший опыт, чем любой другой протестированный инструмент (например, Visual Studio, Toad и dbForge Studio, у всех из которых были серьезные недостатки - в сравнении все это можно было бы охарактеризовать как «полный мусор»). Не уверен, связано ли это с тем, что отлаживаемая функция не включала ни одну из ошибочных конструкций, или проблемы были исправлены.
Я также нашел этот инструмент весьма полезным для отладки моих хранимых процедур.
Я не мог найти способ использовать его в качестве триггера. Не уверен, что есть способ его использовать.
В MySQL есть Инструменты графического интерфейса для отладки хранимых процедур / функции и скрипты. Достойный инструмент dbForge Studio for MySQL, обладающий богатой функциональностью и стабильностью.
Трудно найти, на каких платформах работает этот инструмент отладки. Кажется, работает в Windows. Что-нибудь еще?
Первый и стабильный отладчик для MySQL находится в dbForge Studio for MySQL.
Жаба mysql. Есть бесплатная версия http://www.quest.com/toad-for-mysql/
Я использовал Toad в течение многих лет, но не знал, что у него есть какие-либо специальные функции для отладки sprocs. Не могли бы вы пояснить, как вы для этого используете Toad?
Только что посмотрел на Toad 6.3 для mysql, похоже, есть функция отладки с точками останова и всем остальным. Вы имеете в виду, что функция отладки не работает? Или, может быть, ваша версия старше и не включает функцию отладки?
Мне приходилось использовать два разных инструмента для отладки процедур и функций:
Другой способ представлен здесь
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 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
ОБНОВЛЕНИЕ: MySql для Visual Studio был выделен из Connector / NET в отдельный продукт, вы можете выбрать его (включая отладчик) здесь https://dev.mysql.com/downloads/windows/visualstudio/1.2.html (все еще бесплатно и с открытым исходным кодом).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я был разработчиком, создавшим механизм отладчика хранимых процедур для продукта MySQL для Visual Studio.
При использовании MySQL и Connector .NET возникает проблема со строкой подключения с несколькими хостами. Я объяснил проблему здесь ... Мне было интересно, собирается ли кто-нибудь разбираться в этом? Это вызвало немало проблем для многих из нас .Net-разработчиков, использующих MySQL ...
Сожалеем, что я больше не работаю в Oracle, и у меня нет много свободного времени, я предлагаю связаться со службой поддержки MySQL.
Следующая процедура 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
select concat('** ', msg) AS '** DEBUG:';
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
Похоже, это не работает для FUNCTIONS, и я понятия не имею, почему. Он всегда выдает «Код ошибки: 1415. Не разрешено возвращать набор результатов из функции». Есть ли выход?
Функции @PatrickM не могут возвращать строки ("результат"), пока эта процедура отладки полагается на него (сообщения отладки - это наборы результатов, возвращаемые при вызове процедуры). В функциях вы можете только INSERT INTO my_log_table (message) VALUES (msg) и, возможно, получить все отладочные сообщения после завершения вызовов функций (то есть: вы вернулись в процедуру)
Этот подход хорош, но запись в консоль неэффективна в MySQL Workbench, как IDE. потому что каждый оператор «select» открывает новую панель результатов. Я думаю, что лучше создать временную таблицу журнала для регистрации сообщений об ошибках с отметкой времени и именем процедуры.
Как отлаживать хранимую процедуру 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));
Это хороший быстрый и грязный регистратор, чтобы выяснить, что происходит.
Отладчик для 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;
MySQL Connector / Net 6.6 имеет функцию Отладка хранимых процедур и функций
Installing the Debugger
To enable the stored procedure debugger:
- For Connector/Net 6.6: Install Connector/Net 6.6 and choose the Complete option.
- For Connector/Net 6.7 and later: Install the product MySQL for Visual Studio, to which the stored procedure debugger belongs.
Starting the Debugger
To start the debugger, follow these steps:
- Choose a connection in the Visual Studio Server Explorer.
- Expand the Stored Procedures folder. Only stored procedures can be debugged directly. To debug a user-defined function, create a stored
procedure that calls the function.- Click on a stored procedure node, then right-click and from the context menu choose 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
Это альтернатива методам "вставки" и "журнала". Ваш код не содержит дополнительных инструкций по отладке.
Снимок экрана:
Ответ, соответствующий это от @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
Пользовательская переменная MySQL (совместно используемая в сеансе) может использоваться в качестве вывода журнала:
DELIMITER ;;
CREATE PROCEDURE Foo(tableName VARCHAR(128))
BEGIN
SET @stmt = CONCAT('SELECT * FROM ', tableName);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
-- uncomment after debugging to cleanup
-- SET @stmt = null;
END;;
DELIMITER ;
call Foo('foo');
select @stmt;
выведет:
SELECT * FROM foo
Есть ли варианты графического интерфейса для пользователей, отличных от Windows? Необходимость запускать копию Windows только для отладки хранимых процедур - это своего рода скачок. И большинство параметров вставки таблицы не работают, если вы находитесь в транзакции, которую вы собираетесь откатить.