2013-03-25 93 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爲您指定

也許你應該嘗試錯誤代碼1011爲1329:http://www.briandunning.com/errors/278

另外,嘗試尋找NOT FOUND以及as SQLException

另外,嘗試將exit處理程序放在begin/end子句之外。

所以你BEGINEND條款是

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)中時,該過程不起作用根本不管行是否存在。 – 2013-03-25 11:13:37