Распечатать отладочную информацию из хранимой процедуры в MySQL


Ответы:


117

Вариант 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.


3
mysql жалуется Not allowed to return a result set from a trigger, есть идеи?
Джерри Чин

Вероятно, вы решили проблему почти за 3 года, но используйте вывод в файл, чтобы избавиться от ошибки.
Габриэль Клисеру



5

Обычно я создаю таблицу журнала с хранимой процедурой для входа в нее. Вызов процедуры регистрации, где это необходимо, из разрабатываемой процедуры.

Глядя на другие сообщения по этому же вопросу, это кажется обычной практикой, хотя есть некоторые альтернативы.


5
Таблица журнала должна быть MyISAM или другим механизмом хранения, не связанным с транзакциями, чтобы вы могли отслеживать даже откат транзакций,
Габорш

4

Вот как я буду отлаживать:

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.