与CONCAT一起使用预处理语句时,MySQL语法错误

问题描述 投票:0回答:1

我正在尝试在存储过程中使用准备好的语句。我在初始SET @idToUpdateQuery中遇到语法错误。我已经知道没有使用CONCAT进行变量分配的:=可以正常工作,因为它已在其他地方使用并按预期工作。本质上,我只需要能够将准备好的SELECT语句的结果放入变量@resultId中。有问题的代码如下:

SET @distinctTableXIds = (SELECT COUNT(*) FROM tempTableX);

 SET @i = 0;
 WHILE @i < @distinctTableXIds DO

    /*CONCAT IS NEEDED HERE TO PASS USER DEFINED @i*/
    SET @idToUpdateQuery = CONCAT('SELECT @result := MAX(id) 
    FROM tableY 
    WHERE tableZId = (SELECT id FROM tempTableX ORDER BY id LIMIT ', @i, ', 1)');

    PREPARE @IdToUpdateStmt FROM @IdToUpdateQuery;
    EXECUTE @IdToUpdateStmt;

    SET @resultId = SELECT @result;

    UPDATE tableY
    SET someBoolean = 1
    WHERE id = @resultId;

    SET @i = @i + 1;

 END WHILE;
mysql stored-procedures prepared-statement variable-assignment do-while
1个回答
1
投票

您不将@标记用作语句名称。它不是用户变量。

请参见https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html的示例

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;

此外,我认为您根本不需要为该任务准备一份声明。我可以想到至少两个其他解决方案。请给我几分钟,我会写一个。

© www.soinside.com 2019 - 2024. All rights reserved.