gpt4 book ai didi

mysql - 在 MySQL 9.0 的存储过程/例程中定义用户变量

转载 作者:行者123 更新时间:2023-12-04 07:34:17 25 4
gpt4 key购买 nike

根据 MySQL 8.0 弃用 notes , 从 MySQL 9.0 开始定义用户变量为 DECLARE (例如 DECLARE studentID INT )将被弃用:

Support for setting user variables in statements other than SET wasdeprecated in MySQL 8.0.13. This functionality is subject to removalin MySQL 9.0.


现在 MySQL 8.0.25 已经发出警告:

1287 Setting user variables within expressions is deprecated and willbe removed in a future release. Consider alternatives: SET variable=expression, ..., or 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 替换它基于的方法。

最佳答案

弃用警告不明确,很容易被误解。DECLARE不推荐使用语法。我认为发行说明的作者不认为这是一种“设置”变量的方法。诚然,它确实通过使用可选的 DEFAULT 为声明的变量设置了初始值。条款。但我仍然将其解释为一种不被视为已弃用的声明。
不推荐使用的是在这样的表达式中将变量设置为“副作用”:

SELECT @row := @row+1, ...
该技术是 MySQL 缺少 window functions 的常见解决方法。在 8.0 之前的版本中。但它是非标准语法,通常容易出错且难以使用。既然 MySQL 支持标准 SQL 窗口函数和通用表表达式,您可以像在其他流行的 SQL 实现中编写查询一样编写查询。上面的例子是:
SELECT ROW_NUMBER() OVER (), ...
:=的其他用途赋值是将查询选择列表中的表达式保存到用户定义的变量中。 MySQL 提供了 SELECT ... INTO syntax对于这种用法。这在 8.0 版本之前已经支持很长时间了。
我们还没有听到任何关于 DECLARE 更改的公告。句法。这不需要改变。

回复您的评论:
而不是 SELECT @myVar := somevalue ... ,您可以使用以下任一形式:
SELECT someValue INTO @myVar ...

SET @myVar = (SELECT someValue FROM ...);
请注意,后一种形式不允许您为每个查询设置多个变量。前者允许您像这样设置多个变量:
SELECT someValue, otherValue INTO @myVar1, @myVal2 ...
阅读 SELECT ... INTO 上的文档我链接到上面。

关于mysql - 在 MySQL 9.0 的存储过程/例程中定义用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67812419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com