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行结束,则结束]
您能帮我解决这个问题吗?
如果需要对复合语句使用动态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);