Страницы

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

четверг, 21 февраля 2019 г.

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

Как можно обработать ошибки при дублировании 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 ;


Ответ

Тут приведен код который игнорирует дубликаты и записывает в переменную какое то сообщение при возникновении конкретной ошибки.
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

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

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