首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL 9.0的存储过程/例程中定义用户变量

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

Stack Overflow用户
提问于 2021-06-02 20:50:34
回答 1查看 223关注 0票数 2

根据MySQL 8.0反对意见备注,启动MySQL 9.0将不再推荐使用DECLARE (例如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)__。

因此,我想了解如何将DECLARE正确地替换为SET。假设,我声明了以下变量:

代码语言:javascript
复制
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;的情况下,所有事情都比较明显:

代码语言:javascript
复制
DECLARE cursor_studentID INT; → SET @cursor_studentID;

真正的障碍是最后一个案例:

代码语言:javascript
复制
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

如何用SET-based方法替换它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-02 21:10:59

反对警告不明确,很容易被误解。

不建议使用DECLARE语法。我认为发布说明的作者并不认为是一种“设置”变量的方法。诚然,它确实通过使用可选的DEFAULT子句为声明的变量设置了一个初始值。但我仍然把它解释为一种不被视为不受欢迎的声明。

所反对的是在如下表达式中将变量设置为“副作用”:

代码语言:javascript
复制
SELECT @row := @row+1, ...

这种技术是MySQL在8.0之前发布的版本中缺少窗口函数的常见解决方法。但这是一种非标准的语法,而且通常容易出错,使用起来也很棘手。既然MySQL支持标准的SQL函数和通用表表达式,那么您就可以编写查询,就像在其他流行的SQL实现中编写查询一样。上面的例子是:

代码语言:javascript
复制
SELECT ROW_NUMBER() OVER (), ...

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

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

关于你的评论:

您可以使用以下任何一种表单来代替SELECT @myVar := somevalue ...

代码语言:javascript
复制
SELECT someValue INTO @myVar ...

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

注后一种形式不允许每次查询设置多个变量。前者允许您设置如下多个变量:

代码语言:javascript
复制
SELECT someValue, otherValue INTO @myVar1, @myVal2 ...

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67812419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档