You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程调用时传入错误参数的异常处理问题求助

问题根因

你定义的异常处理器捕获不到参数类型不匹配的错误,原因是:
参数类型校验的执行时机远早于存储过程内部逻辑:当你调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:07