MySQL存储过程传入会话变量时触发1064语法错误求助
存储过程通过会话变量调用时的MySQL语法错误问题
我平时主要用MSSQL,最近给使用MySQL的客户处理任务,在DBeaver中碰到异常问题。
我创建的存储过程如下:
CREATE DEFINER=`myusr`@`%` PROCEDURE `mydb`.`udp_ClientApprovals_Display`( IN _BolSearchText varchar(100) , IN _BolManufSearchText varchar(100) , IN _ClientID int , IN _OrderBy varchar(50)) BEGIN SET @BolSearchText = _BolSearchText , @BolManufSearchText = _BolManufSearchText , @ClientID = _ClientID; -- the rest of my code END
直接传入字面量调用存储过程可正常执行:
CALL udp_ClientApprovals_Display('+test*', '', 1, 'Name');
但通过会话变量传递参数时,会返回如下错误:
SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1
调用语句如下:
SELECT @BolSearchText := '+test*', @BolManufSearchText := '', @ClientID := 1, @OrderBy := 'Name'; CALL udp_ClientApprovals_Display(@BolSearchText, @BolManufSearchText, @ClientID, @OrderBy);
问题原因与解决方法
问题根源在于会话变量命名冲突和变量初始化方式的可靠性:
- 存储过程内部使用的会话变量
@BolSearchText、@BolManufSearchText、@ClientID,和外部调用时的会话变量同名,导致变量值被意外覆盖,进而触发语法错误。 - 使用
SELECT ... := ...初始化多个会话变量时,若某一赋值逻辑返回空结果集,会导致变量被设为NULL,干扰存储过程执行。
修正步骤:
- 重命名存储过程内部的会话变量,避免和外部传入变量重名:
CREATE DEFINER=`myusr`@`%` PROCEDURE `mydb`.`udp_ClientApprovals_Display`( IN _BolSearchText varchar(100) , IN _BolManufSearchText varchar(100) , IN _ClientID int , IN _OrderBy varchar(50)) BEGIN -- 改用带前缀的会话变量,避免冲突 SET @sp_BolSearchText = _BolSearchText , @sp_BolManufSearchText = _BolManufSearchText , @sp_ClientID = _ClientID; -- the rest of my code END
- 改用
SET语句初始化会话变量,比SELECT方式更稳定,避免空结果集导致的NULL赋值:
SET @BolSearchText = '+test*', @BolManufSearchText = '', @ClientID = 1, @OrderBy = 'Name'; CALL udp_ClientApprovals_Display(@BolSearchText, @BolManufSearchText, @ClientID, @OrderBy);
另外,若存储过程中涉及动态SQL拼接(比如使用_OrderBy参数排序),需注意防范SQL注入风险,建议通过白名单限制_OrderBy的可选值,或使用参数化的PREPARE/EXECUTE语句。
内容的提问来源于stack exchange,提问作者Katerine459
相关产品推荐
相关产品推荐

