Чи існує спосіб у MySQL надрукувати повідомлення про налагодження у stdout, спокусливі чи журнальні файли? Щось на зразок:
print
в SQLServerDBMS_OUTPUT.PUT_LINE
в Oracle
Відповіді:
Варіант 1: Помістіть це у своїй процедурі, щоб надрукувати "коментар" до stdout під час запуску.
SELECT 'Comment';
Варіант 2: Помістіть це у своїй процедурі, щоб надрукувати змінну з ним до stdout:
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
Це друкується myvar is 5
на stdout під час запуску процедури.
Варіант 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.
Крім того, коли ви пишете вихідний файл, ви не можете його перезаписати. Це робиться для того, щоб зловмисники не вкорінювали ваш ящик лише тому, що вони ввели ваш сайт і можуть запускати довільні команди в 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.