#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
Комментариев нет:
Отправить комментарий