在MySQL存储函数

时间:2016-05-09 07:10:04

标签: mysql

我打开一个MySQL命令行客户端,输入以下SQL语句。

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 WHEN复合语句的执行流程。上述SELECT语句的查询结果如下:

tstFunction(3)    @a1   @a2    @a3    @a4
0                 NULL  NULL   NULL   NULL

我对@a2的价值感到困惑。为什么NULL?为什么不2
所以我打开一个新的MySQL命令行客户端并重建tstFuncton,但将SELECT语句分成两行:

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

新查询结果很好看:

@a1   @a2    @a3    @a4
NULL  2      NULL   NULL

SELECT陈述的第一种形式发生了什么变化?为什么我需要将其分成两个SELECT语句?

1 个答案:

答案 0 :(得分:0)

在MySQL中,声明局部变量与“set”语句一致。在你的第一种形式的SELECT语句中,你已经直接写了它们,所以你为什么要获得NULLS。

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

在第二种形式中,当您在两个不同的批次中运行两个SELECT时,变量将使用函数中的值声明。

如果你想让他们使用你的第一种形式的SELECT,那么在这之前声明一个变量,

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