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

84

Есть ли в MySQL способ распечатать отладочные сообщения в stdout, temptable или файл журнала? Что-то вроде:

  • print в SQLServer
  • DBMS_OUTPUT.PUT_LINE в Oracle
Арахис
источник
журнал из любого места с помощью incron stackoverflow.com/a/41766032/953374
bortunac

Ответы:

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 года, но используйте вывод в файл, чтобы избавиться от ошибки.
Габриэль Клисеру
6

Быстрый способ что-то напечатать:

select '** Place your mesage here' AS '** DEBUG:';
Роберто Родригес
источник
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.

Мохан Мунисифредди
источник