2011-12-23 25 views
1

MySQLストアドプロシージャで例外ハンドラを定義できますが、ハンドラの例外メッセージをキャッチしてデバッグ目的のテーブルにログを書き込めないようです。私はちょうどMySQLのストアプロシージャで例外コードとメッセージをログに記録するメソッドがあることを知りたいですか?MySQLストアドプロシージャの例外情報をログに記録する

答えて

1

メッセージをキャッチすることはできませんが、エラーコードをキャッチすることはできます。ここで

は、「重複したエントリ」(PK、英国の制約)に対処するための一例である:

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はフィールド1に、英国の制約があり、もう一度、あなたが得ることはありません、既存の値を挿入しようとした場合エラー。何も挿入されず、ステータスは1に等しくなります。

他のエラーコード用に別のハンドラを追加することもできます。そして、あなたはout_statusの値のために何がエラーであるかを常に知っていて、error_code(ハンドラ内)のために "エラーメッセージ"を知っているでしょう。

の場合は、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; 
関連する問題