Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

MySql Handler. Обработка ошибок в процедурах

#mysql #исключения #procedure


Как можно обработать ошибки при дублировании id.Например узнать в каком ряде (INSERT)
она возникла, есть ли такой подход ? 

Я вот который день пытаюсь его реализовать все не получается. IF, CASE че только
не пробовал

DROP TABLE test;
CREATE TABLE test(id INT,PRIMARY KEY (id));

DELIMITER |
DROP PROCEDURE test |
CREATE PROCEDURE test()
BEGIN
    INSERT INTO test VALUES (1);

    INSERT INTO test VALUES (1);

    INSERT INTO test VALUES (1);
END;
|
DELIMITER ;

    


Ответы

Ответ 1



Тут приведен код который игнорирует дубликаты и записывает в переменную какое то сообщение при возникновении конкретной ошибки. SELECT @myError покажет вам ее. SELECT @x будет равен 3 поскольку были проигнорированы дубликаты и код дошел до конца. На счет отловки в каком ряду возникла могу подсказать подход (Не пробовал). Можно в цикле запустить и инициировать какую нибудь переменную в ++ . А потом при ошибке конкатенировать с error сообщением,ну или что то в этом вроде. DELIMITER | DROP PROCEDURE IF EXISTS test | CREATE PROCEDURE test() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @myError = 'You have a error '; SET @x=1; INSERT INTO test VALUES (1); SET @x=2; INSERT INTO test VALUES (1); SET @x=3; INSERT INTO test VALUES (1); END; | DELIMITER ; CALL test(); SELECT @x; SELECT @myError; Если надо сделать какое то действие при возникновении ошибок то пользуйтесь IF ... ELSE DELIMITER | DROP PROCEDURE IF EXISTS test | CREATE PROCEDURE test() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1; SET @x=1; INSERT INTO test VALUES (1); SET @x=2; INSERT INTO test VALUES (2); SET @x=3; INSERT INTO test VALUES (3); IF @x2 = 1 THEN SELECT 0 AS id,'Dannix net' AS title; ELSE SELECT * FROM tbl_name; END IF; END; | DELIMITER ; CALL test(); SELECT @x; SELECT @x2; Тут тоже почитайте полезная инфа DECLARE ... HANDLER Syntax

Комментариев нет:

Отправить комментарий