2011-12-23 66 views
1

據我所知,我可以在MySQL存儲過程中定義異常處理程序,但似乎我無法捕獲處理程序中的異常消息,併爲調試目的在表中寫入日誌。我只想知道是否有方法在MySQL存儲過程中記錄異常代碼和消息?在MySQL存儲過程中記錄異常信息

回答

1

您無法捕獲郵件,但可以捕獲錯誤代碼。

這是對付「重複條目」的例子(PK,UK約束):

CREATE PROCEDURE sp_do_insert(
    IN in_param1 int, 
    IN in_param2 int, 
    OUT out_status tinyint 
) 
BEGIN 
    DECLARE CONTINUE HANDLER FOR 1062 SET out_status = 1; 

    SET out_status = 0; 

    INSERT INTO tbl(field1, fiel2) 
    VALUES (in_param1, in_param2); 
END; 

如果tbl有英國的約束上FIELD1,你會嘗試再次,你不會得到插入現有的值錯誤。不會插入任何內容,並且狀態將等於1.

您還可以爲其他錯誤代碼添加其他處理程序。並且由於out_status的值,您將始終知道錯誤是什麼,並且由於error_code(處理程序中),您將知道「錯誤消息」。

如果是out_status <> 0,您可以嘗試使用show warnings(它顯示最後一個查詢的錯誤/警告)。

希望它有幫助。

0

我不記得是什麼教程我從這個複製了。但是,它在5.6之前的MySQL版本中已經非常有幫助。感謝任何我從中學到的東西!

步驟1:創建一個debug_log表。這將保存你寫下的所有內容。

 
    CREATE TABLE `debug_log` (
     `debug_log_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `msg` varchar(512) NOT NULL, 
     `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
     PRIMARY KEY (`debug_log_id`) 
    ) ENGINE=MyISAM 

第2步:創建一個用於將信息添加到debug_log表的存儲過程。

 
    DELIMITER $$ 

    USE `your_db_name_here`$$ 

    DROP PROCEDURE IF EXISTS `log_debug`$$ 

    CREATE DEFINER=`ss7admin`@`%` PROCEDURE `log_debug`(IN lastMsg VARCHAR(512)) 

    BEGIN 
     INSERT INTO debug_log (msg) VALUES (lastMsg); 
    END$$ 

    DELIMITER ; 

第3步:在您的真實存儲過程中添加處理程序。

 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
     CALL log_debug( 
      CONCAT 
      (
       now(), 
       ' : Something went horribly wrong!', 
       '.' 
      ) 
     ); 

     CALL log_debug('Exiting now'); 

     SET outReturnCode = 1; 
    END;