Записать информацию об исключении в хранимую процедуру MySQL - PullRequest
1 голос
/ 23 декабря 2011

Как я знаю, я могу определить обработчик исключений в хранимой процедуре MySQL, но, похоже, я не могу перехватить сообщение об исключении в обработчике и записать журнал в таблицу для отладки. Я просто хочу знать, есть ли метод для регистрации кода исключения и сообщения в процедуре хранения MySQL?

Ответы [ 3 ]

1 голос
/ 19 января 2012

Вы можете перехватить сообщение, код ошибки, состояние sql, ... с помощью инструкции GET DIAGNOSTICS в 5.6.4

См http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html

1 голос
/ 23 декабря 2011

Вы не можете поймать сообщение, но вы можете поймать код ошибки.

Вот пример работы с «Дубликатом» (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 имеет ограничение UK для поля field1, и вы попытаетесь вставить существующее значение еще раз, вы не получите ошибку. Ничего не будет вставлено, и статус будет равен 1.

Вы также можете добавить еще один обработчик для других кодов ошибок. И вы всегда будете знать, что является ошибкой из-за значения out_status, и вы будете знать «сообщение об ошибке» из-за error_code (в обработчике).

Вы можете попробовать поиграть с show warnings (показывает ошибки / предупреждения для последнего запроса) в случае, если out_status <> 0.

Надеюсь, это поможет.

0 голосов
/ 28 сентября 2012

Я не помню, из какого урока я это скопировал.Тем не менее, это очень помогло в версиях MySQL до 5.6.Спасибо кому я узнал об этом!

Шаг 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;
...