MySQL中是否有一种方法可以将调试消息打印到stdout,temptable或logfile?就像是:
print
在SQLServer中DBMS_OUTPUT.PUT_LINE
在甲骨文
Answers:
选项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目录中。
同样,一旦写入输出文件,就无法覆盖它。这是为了防止破解者仅仅因为他们将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中的第一条语句。