2013-03-25 4 views
2

Почему этот код не улавливает ошибку при попытке удалить строку, которая не существует? Независимо от того, какой параметр я передаю как имя строки, он всегда возвращает «1 строка удалена» и не использует обработчики вывода. которые должны поймать только этот тип ошибки.Ошибка MySQL в ошибке

USE yoga; 

DROP PROCEDURE IF EXISTS delete_warmup; 

DELIMITER // 

CREATE PROCEDURE delete_warmup 
(
    warmup_name_param    VARCHAR(100) 
) 
BEGIN 
DECLARE row_not_found  TINYINT DEFAULT FALSE; 
DECLARE sql_exception  TINYINT DEFAULT FALSE; 

BEGIN 
    DECLARE EXIT HANDLER FOR 1329 
     SET row_not_found = TRUE; 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
     SET sql_exception = TRUE; 

    DELETE FROM warmup 
    WHERE warmup_name = warmup_name_param; 

    SELECT '1 row was deleted.' AS message; 
END; 

IF row_not_found = TRUE THEN 
    SELECT 'Row not deleted - row not found' AS message; 
ELSEIF sql_exception = TRUE THEN 
    SHOW ERRORS; 
END IF; 

END// 

DELIMITER ; 

CALL delete_warmup ('Monkey business'); 

ответ

0

Вы используете обработчик выхода для дублирующего параметра: http://www.briandunning.com/errors/596 который является 1329, как было указано

Может быть, вы должны попробовать код ошибки 1011: http://www.briandunning.com/errors/278

Кроме того, попробуйте поискать NOT FOUND а как SQLException

Кроме того, попробуйте поместить выходной обработчик вне предложения begin/end.

поэтому ваш BEGIN и END пункт будет

DECLARE EXIT HANDLER FOR 1011 
DECLARE EXIT HANDLER FOR SQLEXCEPTION, NOT FOUND 
BEGIN 
     SET row_not_found = TRUE; 
     SET sql_exception = TRUE; 

    DELETE FROM warmup 
    WHERE warmup_name = warmup_name_param; 

    SELECT '1 row was deleted.' AS message; 
END; 
+0

Спасибо за ваш ответ. Я пробовал это с NOT FOUND, а также с кодами ошибок 1011, 1017, 1032, 1065 и 1329. Когда я размещаю обработчики вывода во внешнем BEGIN/END (вместо вложенного BEGIN/END), процедура не работает вообще, независимо от того, существует или нет строка. –

Смежные вопросы