Есть ли в MySQL способ распечатать отладочные сообщения в stdout, temptable или файл журнала? Что-то вроде:
print
в SQLServerDBMS_OUTPUT.PUT_LINE
в Oracle
Ответы:
Вариант 1. Поместите это в свою процедуру, чтобы печатать «комментарий» к стандартному выводу при ее запуске.
SELECT 'Comment';
Вариант 2: Поместите это в свою процедуру, чтобы распечатать переменную с ней в stdout:
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
Это выводится myvar is 5
на стандартный вывод при запуске процедуры.
Вариант 3. Создайте таблицу с одним текстовым столбцом tmptable
и отправьте в нее сообщения:
declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
Вы можете поместить это в хранимую процедуру, поэтому все, что вам нужно будет написать, это следующее:
CALL log(concat('the value is', myvar));
Что экономит несколько нажатий клавиш.
Вариант 4, записывать сообщения в файл
select "penguin" as log into outfile '/tmp/result.txt';
На эту команду накладываются очень серьезные ограничения. Вы можете записывать исходящий файл только в те области на диске, которые предоставляют «другим» группам права на создание и запись. Он должен работать, сохраняя его в каталог / tmp.
Также, как только вы напишете файл Outfile, вы не сможете его перезаписать. Это сделано для того, чтобы взломщики не укоренили ваш компьютер только потому, что они внедрили SQL на ваш сайт и могут запускать произвольные команды в MySQL.
Not allowed to return a result set from a trigger
, есть идеи?
Один способ обхода - просто использовать select без каких-либо других предложений.
Быстрый способ что-то напечатать:
select '** Place your mesage here' AS '** DEBUG:';
Обычно я создаю таблицу журнала с хранимой процедурой для входа в нее. Вызов процедуры регистрации, где это необходимо, из разрабатываемой процедуры.
Глядя на другие сообщения по этому же вопросу, это кажется обычной практикой, хотя есть некоторые альтернативы.
Вот как я буду отлаживать:
CREATE PROCEDURE procedure_name()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS; --this is the only one which you need
ROLLBACK;
END;
START TRANSACTION;
--query 1
--query 2
--query 3
COMMIT;
END
Если запрос 1, 2 или 3 выдаст ошибку, HANDLER поймает SQLEXCEPTION, а SHOW ERRORS покажет нам ошибки. Примечание: SHOW ERRORS должно быть первым оператором в HANDLER.