2

根据 MySQL 8.0 deprecations notesDECLARE ,从 MySQL 9.0 开始,使用(eg )定义的用户变量DECLARE studentID INT将被弃用:

SET在 MySQL 8.0.13 中不推荐使用的语句中设置用户变量的支持。此功能可能会在 MySQL 9.0 中删除。

现在 MySQL 8.0.25 已经发出警告:

1287 在表达式中设置用户变量已被弃用,并将在未来的版本中删除。考虑替代方案:SET variable=expression, ...SELECT expression(s) INTO variables(s)

因此,我想了解如何正确替换DECLARESET. 假设,我声明了以下变量:

DECLARE cursor_studentID INT;
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT courseID FROM tblCoursesToCopy;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

现在我想让这些声明与 MySQL 9.0 兼容。如果DECLARE cursor_studentID INT;一切都比较明显:

DECLARE cursor_studentID INT; → SET @cursor_studentID;

真正的障碍是最后一种情况:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

我不明白如何用SET基于 - 的方法替换它。

4

1 回答 1

2

弃用警告不明确,很容易被误解。

DECLARE不推荐使用该语法。我认为发行说明的作者不认为这是一种“设置”变量的方法。诚然,它确实通过使用可选DEFAULT子句为声明的变量设置了一个初始值。但我仍然将其解释为不被视为已弃用的声明。

不推荐使用的是在如下表达式中将变量设置为“副作用”:

SELECT @row := @row+1, ...

该技术是 MySQL在 8.0 之前的版本中缺少窗口函数的常见解决方法。但它是非标准语法,通常容易出错且难以使用。现在 MySQL 支持标准 SQL 窗口函数和公用表表达式,您可以像在其他流行的 SQL 实现中编写查询一样编写查询。上面的例子是:

SELECT ROW_NUMBER() OVER (), ...

赋值的另一个用途:=是将查询的选择列表中的表达式保存到用户定义的变量中。MySQL 提供了这种用法的SELECT ... INTO语法。这在 8.0 版本之前已经支持了很长时间。

我们还没有听到任何有关更改DECLARE语法的公告。这不需要改变。


回复您的评论:

代替SELECT @myVar := somevalue ...,您可以使用以下任一形式:

SELECT someValue INTO @myVar ...

SET @myVar = (SELECT someValue FROM ...);

请注意,后一种形式不允许您为每个查询设置多个变量。前者允许您像这样设置多个变量:

SELECT someValue, otherValue INTO @myVar1, @myVal2 ...

阅读SELECT ... INTO我上面链接到的文档。

于 2021-06-02T21:10:59.380 回答