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

时间:2010-07-23 01:35:58

标签: mysql debugging

MySQL是否有办法将调试消息打印到stdout,temptable或logfile?类似的东西:

    SQL Server 中的
  • print Oracle中的
  • DBMS_OUTPUT.PUT_LINE

5 个答案:

答案 0 :(得分:93)

选项1:将其放入您的程序中,以便在stdout运行时将'comment'打印出来。

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';

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

在同一个问题上看other posts,这似乎是一种常见做法,尽管有一些替代方案。

答案 3 :(得分:1)

这是我调试的方式:

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中的第一条语句。

答案 4 :(得分:0)

快速打印内容的方法是:

select '** Place your mesage here' AS '** DEBUG:';