使用if条件运行prepare语句时出现1064错误

问题描述 投票:0回答:1
DROP PROCEDURE IF EXISTS `test_proc`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `test_proc`(param_a int)
BEGIN
set @sqlstr_3=concat('if (1=',param_a,') then ');
set @sqlstr_3=concat(@sqlstr_3, 'select 1;else select 2;');
set @sqlstr_3=concat(@sqlstr_3, ' end if;');
select @sqlstr_3;
/**
prepare stmt_3 from @sqlstr_3;
execute stmt_3;
deallocate prepare stmt_3;
*/
if (1=param_a) then select 1;else select 2; end if;
END
;;
DELIMITER ;

当我使用以下方法调用此过程时:调用test_proc(2),它可以正常工作并返回两个结果:结果1:如果(1 = 2),则选择1;否则选择2;万一;result2:2

但是当我使用prepare语句时,出现错误。

DROP PROCEDURE IF EXISTS `test_proc`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `test_proc`(param_a int)
BEGIN
set @sqlstr_3=concat('if (1=',param_a,') then ');
set @sqlstr_3=concat(@sqlstr_3, 'select 1;else select 2;');
set @sqlstr_3=concat(@sqlstr_3, ' end if;');
select @sqlstr_3;

prepare stmt_3 from @sqlstr_3;
execute stmt_3;
deallocate prepare stmt_3;

-- if (1=param_a) then select 1;else select 2; end if;
END
;;
DELIMITER ;

我使用以下方法调用此过程:调用test_proc(2),但出现了一些错误:

[Err] 1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在'if(1 = 2)附近使用正确的语法,然后选择1;否则选择2;如果在第1行结束,则结束]

您能帮我解决这个问题吗?

mysql prepared-statement
1个回答
0
投票

如果需要对复合语句使用动态SQL,则必须将其转换为单个语句。例如,您的

if (1=param_a) then select 1;else select 2; end if;

可能会转换为附近的东西

select 1 WHERE (1=param_a)
UNION ALL
select 2 WHERE NOT (1=param_a);
© www.soinside.com 2019 - 2024. All rights reserved.