首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL存储函数中设置的奇怪会话变量值

问在MySQL存储函数中设置的奇怪会话变量值
EN

Stack Overflow用户
提问于 2016-05-09 15:10:04
回答 1查看 34关注 0票数 0

我打开一个SQL Client,然后键入以下MySQL语句。

代码语言:javascript
复制
use green;
delimiter $
drop function if exists tstFunction $
create function tstFunction(cnt int) returns int
begin    
    case when 1 > cnt then set @a1 := 1;
         when 5 > cnt then set @a2 := 2;
         when 4 > cnt then set @a3 := 3;
         else set @a4 := 4;
    end case;
    return 0;
end $
delimiter ;

select tstFunction(3), @a1, @a2, @a3, @a4;

我想测试的是CASE在复合语句时的执行流程。以上SELECT语句的查询结果如下:

代码语言:javascript
复制
tstFunction(3)    @a1   @a2    @a3    @a4
0                 NULL  NULL   NULL   NULL

我对@a2的价值感到困惑。为什么是NULL?为什么不使用2?

因此,我打开一个新的MySQL命令行客户端并重新构建tstFuncton,但将SELECT语句分成两行,如下所示:

代码语言:javascript
复制
select tstFunction(3);
select @a1, @a2, @a3, @a4;

并且新的查询结果看起来很好:

代码语言:javascript
复制
@a1   @a2    @a3    @a4
NULL  2      NULL   NULL

第一种形式的SELECT语句发生了什么变化?为什么我需要把它分成两条SELECT语句?

EN

回答 1

Stack Overflow用户

发布于 2016-05-09 17:00:20

在MySQL中,声明局部变量与"set“语句一起使用。在您的第一个SELECT语句形式中,您已经直接编写了它们,所以为什么您会得到NULLS。

你可能会有一个问题,你已经在你的函数中声明了它们。但问题是,执行函数和打印变量都在单个SELECT语句中,这意味着它们将作为单个批处理执行。

在第二种形式中,当您在两个不同的批处理中运行这两个SELECT时,变量以函数的值声明。

如果您想让它们与您的第一种SELECT形式一起出现,那么就像这样在之前声明一个变量,

代码语言:javascript
复制
set @a2 = '';
select tstFunction(3), @a1, @a2, @a3, @a4;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37109689

复制
相关文章

相似问题

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