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

如何编写带IF ELSE的MySQL存储过程?及现有存储过程无结果修复

问题排查与修复方案

核心问题点

  • 存储过程名称不匹配:你调用的是SP_BOM_DETAILED_SELECT_PROJECT_DETAILS,但实际创建的存储过程名为SP_SELECT_DATA_DETAIL,直接导致调用无效。
  • 动态SQL未执行:仅拼接了查询语句,但没有执行这个动态SQL,自然不会返回结果。
  • SQL拼接语法错误:原代码中对@Project_No的引号嵌套错误,导致生成的SQL语句语法失效。
  • 条件逻辑冗余:CASE语句的写法复杂且易出错,可简化为更直观的条件判断。

修复后的存储过程代码

DELIMITER $$

USE `testing`$$

DROP PROCEDURE IF EXISTS `SP_SELECT_DATA_DETAIL`$$

CREATE DEFINER=`testing1`@`%` PROCEDURE `SP_SELECT_DATA_DETAIL`(
    IN _Project_No VARCHAR(100),
    IN _status VARCHAR(20)
)
BEGIN
    SET @Project_No = RTRIM(_Project_No);
    SET @status = _status;

    -- 初始化基础查询语句,简化条件判断
    SET @sqlStatement = CONCAT(
        'SELECT A.Project_Description, B.Short_Name, ',
        'UPPER(IF(A.Project_Status = '' '', "OPEN", A.Project_Status)) AS Project_Status ',
        'FROM project_detail A ',
        'LEFT JOIN company B ON A.`Customer` = B.`Com_ID` ',
        'WHERE 1 = 1 '
    );

    -- 添加Project_No的过滤条件
    IF @Project_No <> '' THEN
        SET @sqlStatement = CONCAT(@sqlStatement, ' AND A.Project_No LIKE CONCAT("%", "', @Project_No, '", "%") ');
    END IF;

    -- 添加status过滤条件
    IF @status <> 'All' THEN
        SET @sqlStatement = CONCAT(@sqlStatement, ' AND A.Project_Status = "', @status, '" ');
    END IF;

    -- 添加排序
    SET @sqlStatement = CONCAT(@sqlStatement, ' ORDER BY A.Project_No DESC ');

    -- 执行动态SQL
    PREPARE stmt FROM @sqlStatement;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;

修正后的调用语句

CALL SP_SELECT_DATA_DETAIL('8023', 'All');

关键修复说明

  1. 修正名称匹配问题:调用语句使用正确的存储过程名SP_SELECT_DATA_DETAIL。
  2. 添加动态SQL执行步骤:通过PREPARE、EXECUTE、DEALLOCATE执行拼接好的查询语句,确保返回结果。
  3. 简化条件逻辑:将原复杂的CASE语句拆分为清晰的IF判断,避免拼接错误。
  4. 修正引号拼接:直接正确拼接变量与单引号,确保生成的SQL语法合法。
  5. 提前处理变量trim:在赋值时就对_Project_No做RTRIM,避免后续重复处理。

内容的提问来源于stack exchange,提问作者Anggelaaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:05:40