从MySQL中的存储过程打印调试信息

Pea*_*nut 70 mysql debugging

MySQL中有没有办法将调试消息打印到stdout,temptable或logfile?就像是:

  • print 在SQLServer中
  • DBMS_OUTPUT.PUT_LINE 在Oracle中

小智 99

选项1:将它放在您的过程中,以便在运行时将'comment'打印到stdout.

SELECT 'Comment';
Run Code Online (Sandbox Code Playgroud)

选项2:将其放入您的过程中以将变量打印到stdout:

declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
Run Code Online (Sandbox Code Playgroud)

myvar is 5当程序运行时,这将打印到stdout.

选项3,创建一个名为一个文本列的表tmptable,并将消息推送给它:

declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
Run Code Online (Sandbox Code Playgroud)

你可以将上面的内容放在一个存储过程中,所以你要写的就是:

CALL log(concat('the value is', myvar));
Run Code Online (Sandbox Code Playgroud)

这节省了一些按键.

选项4,将消息记录到文件

select "penguin" as log into outfile '/tmp/result.txt';
Run Code Online (Sandbox Code Playgroud)

这个命令有很多限制.您只能将outfile写入磁盘上为"其他"组创建和写入权限的区域.它应该将它保存到/ tmp目录.

一旦你编写了outfile,你就无法覆盖它.这是为了防止破解者只是因为他们有SQL注入你的网站而可以在MySQL中运行任意命令.

  • mysql抱怨`不允许从触发器返回结果集`,任何想法? (3认同)

Rob*_*uez 8

打印东西的快速方法是:

select '** Place your mesage here' AS '** DEBUG:';
Run Code Online (Sandbox Code Playgroud)


b8b*_*b8j 6

一种解决方法是使用select而不使用任何其他子句.

http://lists.mysql.com/mysql/197901


Rob*_*oke 5

我通常使用存储过程创建日志表以记录它.从开发中的过程调用日志记录过程.

看看同一个问题的其他帖子,这似乎是一种常见的做法,尽管有一些替代方案.

  • 日志表应该是MyISAM或其他非事务性存储引擎,因此您甚至可以跟踪回滚事务, (3认同)

小智 5

这就是我调试的方式:

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 
Run Code Online (Sandbox Code Playgroud)

如果查询 1、2 或 3 将抛出错误,HANDLER 将捕获 SQLEXCEPTION,并且 SHOW ERRORS 将为我们显示错误。注意:SHOW ERRORS 应该是 HANDLER 中的第一个语句。