当 运行 准备带有 if 条件的语句时出现 1064 错误
I got 1064 error when running prepare statement with if condition
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) ,它工作正常并且 returns 两个结果:
结果 1: if (1=2) then select 1;else select 2;如果结束;
结果 2: 2
但是当我使用 prepare statement.It 时出现错误。
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 服务器版本对应的手册,了解在第 1
行 'if (1=2) then select 1;else select 2; end if' 附近使用的正确语法
你能帮我解决这个问题吗?
如果复合语句需要使用动态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);
或者,您可以使用单独的条件块来创建单独的 SQL 语句(甚至可能是 PREPARE):
IF 1=param_a THEN
set @sqlstr_3='select 1;';
ELSE
set @sqlstr_3='select 2;';
END IF;
PREPARE stmt_3 FROM @sqlstr_3;
EXECUTE stmt_3;
DROP PREPARE stmt_3;
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) ,它工作正常并且 returns 两个结果:
结果 1: if (1=2) then select 1;else select 2;如果结束;
结果 2: 2
但是当我使用 prepare statement.It 时出现错误。
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 服务器版本对应的手册,了解在第 1
行 'if (1=2) then select 1;else select 2; end if' 附近使用的正确语法你能帮我解决这个问题吗?
如果复合语句需要使用动态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);
或者,您可以使用单独的条件块来创建单独的 SQL 语句(甚至可能是 PREPARE):
IF 1=param_a THEN
set @sqlstr_3='select 1;';
ELSE
set @sqlstr_3='select 2;';
END IF;
PREPARE stmt_3 FROM @sqlstr_3;
EXECUTE stmt_3;
DROP PREPARE stmt_3;