在 MySQL 中,使用 PREPARE 和 EXECUTE 执行动态 SQL 语句时,对于 INTO 子句确实不能直接使用 DECLARE 定义的变量。
原因是 DECLARE 定义的变量通常是在存储过程或函数的开始部分进行声明,并且其作用域主要在存储过程或函数内部的特定块中。而 PREPARE 和 EXECUTE 执行动态 SQL 语句的上下文与存储过程内部的普通代码块稍有不同。
而使用 SET 提前定义的用户变量在整个会话中都有一定的可见性,并且可以在动态 SQL 语句执行时被正确地识别和赋值。
以下是一个示例展示如何使用 SET 定义的变量在动态 SQL 中接收结果:
PREPARE stmt FROM 'SELECT COUNT(*) INTO @result FROM your_table';
EXECUTE stmt;
SELECT @result;
DEALLOCATE PREPARE stmt;
如果你希望在存储过程中使用动态 SQL 并将结果赋值给一个变量,可以考虑使用 SET 定义的用户变量来实现。