2

存在しない行を削除しようとすると、このコードがエラーをキャッチしないのはなぜですか? 行の名前としてどのパラメーターを渡しても、常に「1行削除」が返され、終了ハンドラーは使用されません。このタイプのエラーだけをキャッチするはずです。

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');
4

1 に答える 1

-1

重複するパラメーターに終了ハンドラーを使用しています: http://www.briandunning.com/errors/596 これは、指定した 1329 です

おそらく、エラー コード 1011 を試す必要があります: http://www.briandunning.com/errors/278

NOT FOUNDまた、同様に探してみてくださいSQLException

また、終了ハンドラーを begin/end 節の外に置くようにしてください。

あなたのBEGINandEND節は

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;
于 2013-03-25T03:14:10.033 に答える