【发布时间】:2010-07-23 01:35:57
【问题描述】:
MySQL 有没有办法将调试消息打印到标准输出、临时表或日志文件?比如:
-
SQLServer 中的
print -
DBMS_OUTPUT.PUT_LINE在 Oracle 中
【问题讨论】:
-
使用 incron stackoverflow.com/a/41766032/953374从任何地方登录
MySQL 有没有办法将调试消息打印到标准输出、临时表或日志文件?比如:
print
DBMS_OUTPUT.PUT_LINE 在 Oracle 中【问题讨论】:
选项 1:将其放入您的程序中,以便在运行时将“评论”打印到标准输出。
SELECT 'Comment';
选项 2:将其放入您的程序中以将变量与它一起打印到标准输出:
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 目录。
此外,一旦您编写了输出文件,就无法覆盖它。这是为了防止破解者仅仅因为他们已经将 SQL 注入您的网站并且可以在 MySQL 中运行任意命令,就将您的机器生根。
【讨论】:
Not allowed to return a result set from a trigger,知道吗?
打印内容的快速方法是:
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 中的第一条语句。
【讨论】:
我通常使用存储过程创建日志表来记录到它。从正在开发的过程中在任何需要的地方调用日志记录过程。
在同一个问题上查看other posts,这似乎是一种常见做法,尽管有一些替代方案。
【讨论】:
一种解决方法是只使用 select 而不使用任何其他子句。
【讨论】: