Как отловить любое исключение в триггерах и сохранить процедуры для MySQL? - PullRequest
2 голосов
/ 02 августа 2011

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

Спасибо Hitesh

Ответы [ 2 ]

2 голосов
/ 30 сентября 2014

Поскольку это занимает первое место в моем поиске обработки ошибок MySQL в триггерах, я решил поделиться своим решением для MySQL 5.5 +

Мой оригинальный пост: https://stackoverflow.com/a/26115231/1733365 Дублировано ниже ...

Поскольку эта статья выходит на первое место, когда я ищу обработку ошибок в триггерах MySQL, я решил поделиться некоторыми знаниями.

Если есть ошибка, вы можете заставить MySQL использовать SIGNAL , но если вы не укажете его как класс в качестве SQLEXCEPTION, то ничего не произойдет, так как не все SQLSTATE считаются плохими и даже в этом случае вы должны будете убедиться, что RESIGNAL , если у вас есть вложенные блоки BEGIN / END.

В качестве альтернативы и, возможно, еще проще, в вашем триггере объявить обработчик выхода и передать исключение.

CREATE TRIGGER `my_table_AINS` AFTER INSERT ON `my_table` FOR EACH ROW
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        RESIGNAL;
    DECLARE EXIT HANDLER FOR SQLWARNING
        RESIGNAL;
    DECLARE EXIT HANDLER FOR NOT FOUND
        RESIGNAL; 
    -- Do the work of the trigger.
END

И если в вашем теле произойдет ошибка, она будет отброшена наверх и выйдет с ошибкой. Это также может быть использовано в хранимых процедурах и еще много чего.

Это работает с любой версией 5.5 +.

2 голосов
/ 02 августа 2011

Проверьте синтаксис DECLARE HANDLER

http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html

Кроме того, если вы пытаетесь отлаживать SP, это может быть полезно для вас:

http://www.bluegecko.net/mysql/debugging-stored-procedures/

...