存储过程调用时传入错误参数的异常处理问题求助
问题根因
你定义的异常处理器捕获不到参数类型不匹配的错误,原因是:
参数类型校验的执行时机远早于存储过程内部逻辑:当你调用CALL changePrice('Metallwaren', 'a');时,MySQL首先会校验传入参数和存储过程定义的参数类型是否匹配:第二个参数要求为INT类型,你传入了字符串'a',这个校验阶段还没有进入存储过程内部代码执行环节,校验失败会直接抛出错误,内部定义的SQLEXCEPTION处理器根本不会被触发,stat_var自然不会被赋值为1。
修复方案
如果要捕获这类参数传入类错误,建议放宽参数类型,在存储过程内部做类型合法性校验,修改后代码参考如下:
DROP PROCEDURE IF EXISTS changePrice; DELIMITER $$ CREATE PROCEDURE changePrice(IN categorie VARCHAR(30), IN factor_str VARCHAR(30)) -- 把参数类型放宽为VARCHAR BEGIN DECLARE stat_var INT DEFAULT 0; DECLARE factor INT DEFAULT 0; BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET stat_var = 1; END; -- 先做参数类型转换,转换失败会触发异常被处理器捕获 SET factor = CAST(factor_str AS UNSIGNED); UPDATE Artikel SET Einzelpreis = (Einzelpreis * (factor / 100)) WHERE Kategorie = categorie; END; IF stat_var = 1 THEN SELECT 'Fehler MOOOOOOOP'; END IF; END $$ DELIMITER ; -- 现在传入字符串类型的非法值,会被内部异常处理器捕获,正常返回自定义错误提示 CALL changePrice('Metallwaren', 'a');
内容的提问来源于stack exchange,提问作者drombusch_it
相关产品推荐
相关产品推荐

